summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsebres <sebres@users.sourceforge.net>2017-07-10 11:12:32 (GMT)
committersebres <sebres@users.sourceforge.net>2017-07-10 11:12:32 (GMT)
commit10c4411b959259a23acf9d979fe3faf06d177288 (patch)
tree6994e22713a75014e9f8e5d6abf9a835f0cc4380
parent36d3c6b3d97e0f57c2ce91ead998c66dd84e9411 (diff)
parent8383ac341f0de983f9df6eb589ee893a2ac11aba (diff)
downloadtcl-10c4411b959259a23acf9d979fe3faf06d177288.zip
tcl-10c4411b959259a23acf9d979fe3faf06d177288.tar.gz
tcl-10c4411b959259a23acf9d979fe3faf06d177288.tar.bz2
merge sebres-8-5-event-perf-branch
-rw-r--r--generic/tclEvent.c2
-rw-r--r--generic/tclIO.c2
-rw-r--r--generic/tclNotify.c102
3 files changed, 73 insertions, 33 deletions
diff --git a/generic/tclEvent.c b/generic/tclEvent.c
index 0d89b19..bdc1b44 100644
--- a/generic/tclEvent.c
+++ b/generic/tclEvent.c
@@ -1552,7 +1552,6 @@ Tcl_VwaitObjCmd(
break;
}
if (Tcl_LimitExceeded(interp)) {
- Tcl_ResetResult(interp);
Tcl_SetObjResult(interp, Tcl_NewStringObj("limit exceeded", -1));
done = -4;
break;
@@ -1567,7 +1566,6 @@ Tcl_VwaitObjCmd(
if (done <= -2) {
if (done == -2) {
- Tcl_ResetResult(interp);
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
"can't wait for variable \"%s\": would wait forever",
nameString));
diff --git a/generic/tclIO.c b/generic/tclIO.c
index e2c4f32..63f0afa 100644
--- a/generic/tclIO.c
+++ b/generic/tclIO.c
@@ -8507,7 +8507,7 @@ UpdateInterest(
mask &= ~TCL_EXCEPTION;
if (!statePtr->schedEvent) {
- statePtr->schedEvent = CreateChannelScheduledEvent(chanPtr);
+ statePtr->schedEvent = CreateChannelScheduledEvent(chanPtr);
}
}
}
diff --git a/generic/tclNotify.c b/generic/tclNotify.c
index c5eaf1f..9d7c225 100644
--- a/generic/tclNotify.c
+++ b/generic/tclNotify.c
@@ -122,7 +122,8 @@ TCL_DECLARE_MUTEX(listLock)
static void QueueEvent(ThreadSpecificData *tsdPtr,
Tcl_Event *evPtr, Tcl_QueuePosition position);
-
+
+
/*
*----------------------------------------------------------------------
*
@@ -166,7 +167,8 @@ TclInitNotifier(void)
}
Tcl_MutexUnlock(&listLock);
}
-
+
+
/*
*----------------------------------------------------------------------
*
@@ -237,7 +239,8 @@ TclFinalizeNotifier(void)
Tcl_MutexUnlock(&listLock);
}
-
+
+
/*
*----------------------------------------------------------------------
*
@@ -263,7 +266,8 @@ Tcl_SetNotifier(
{
tclNotifierHooks = *notifierProcPtr;
}
-
+
+
/*
*----------------------------------------------------------------------
*
@@ -319,7 +323,8 @@ Tcl_CreateEventSource(
sourcePtr->nextPtr = tsdPtr->firstEventSourcePtr;
tsdPtr->firstEventSourcePtr = sourcePtr;
}
-
+
+
/*
*----------------------------------------------------------------------
*
@@ -369,7 +374,8 @@ Tcl_DeleteEventSource(
return;
}
}
-
+
+
/*
*----------------------------------------------------------------------
*
@@ -400,7 +406,8 @@ Tcl_QueueEvent(
QueueEvent(tsdPtr, evPtr, position);
}
-
+
+
/*
*----------------------------------------------------------------------
*
@@ -451,7 +458,8 @@ Tcl_ThreadQueueEvent(
}
Tcl_MutexUnlock(&listLock);
}
-
+
+
static inline void
SpliceEventTail(
Tcl_Event *evPtr,
@@ -466,7 +474,8 @@ SpliceEventTail(
}
*lastEvPtr = evPtr;
}
-
+
+
static inline void
LinkEvent(
ThreadSpecificData *tsdPtr,
@@ -484,7 +493,8 @@ LinkEvent(
tsdPtr->lastEventPtr = evPtr;
}
}
-
+
+
/*
*----------------------------------------------------------------------
*
@@ -574,7 +584,8 @@ QueueEvent(
}
Tcl_MutexUnlock(&(tsdPtr->queueMutex));
}
-
+
+
static Tcl_Event *
SearchEventInQueue(
Tcl_Event *firstEvPtr,
@@ -604,7 +615,8 @@ SearchEventInQueue(
}
return evPtr;
}
-
+
+
static void
UnlinkEvent(
ThreadSpecificData *tsdPtr,
@@ -638,7 +650,8 @@ UnlinkEvent(
tsdPtr->timerMarkerPtr = prevPtr ? prevPtr : INT2PTR(-1);
}
}
-
+
+
static void
InvolveRetardedEvents(
ThreadSpecificData *tsdPtr)
@@ -653,7 +666,8 @@ InvolveRetardedEvents(
/* reset retarded list */
tsdPtr->lastRetardEv = tsdPtr->firstRetardEv = NULL;
}
-
+
+
static void
UnlinkRetardedEvent(
ThreadSpecificData *tsdPtr,
@@ -669,7 +683,8 @@ UnlinkRetardedEvent(
tsdPtr->lastRetardEv = prevPtr;
}
}
-
+
+
/*
*----------------------------------------------------------------------
*
@@ -741,7 +756,8 @@ Tcl_DeleteEvents(
Tcl_MutexUnlock(&(tsdPtr->queueMutex));
}
-
+
+
void
TclpCancelEvent(
Tcl_Event *evPtr) /* Event to remove from queue. */
@@ -768,7 +784,8 @@ TclpCancelEvent(
Tcl_MutexUnlock(&(tsdPtr->queueMutex));
}
-
+
+
/*
*----------------------------------------------------------------------
*
@@ -1008,7 +1025,8 @@ Tcl_ServiceEvent(
return 0;
}
-
+
+
#if TCL_CHECK_EVENT_SOURCE_THRESHOLD
/*
*----------------------------------------------------------------------
@@ -1046,7 +1064,8 @@ CheckSourceThreshold(
return 1;
}
#endif
-
+
+
static int
SetUpEventSources(
ThreadSpecificData *tsdPtr,
@@ -1071,9 +1090,22 @@ SetUpEventSources(
}
tsdPtr->inTraversal--;
+ /*
+ * If we've some retarded events (from last event-cycle), wait non-blocking.
+ */
+ if ( tsdPtr->firstRetardEv
+ && ( !tsdPtr->blockTimeSet
+ || tsdPtr->blockTimeServLev < tsdPtr->serviceLevel )
+ ) {
+ tsdPtr->blockTime.sec = 0;
+ tsdPtr->blockTime.usec = 0;
+ tsdPtr->blockTimeSet = 1;
+ }
+
return res;
}
-
+
+
static int
CheckEventSources(
ThreadSpecificData *tsdPtr,
@@ -1110,7 +1142,8 @@ CheckEventSources(
return res;
}
-
+
+
/*
*----------------------------------------------------------------------
*
@@ -1173,7 +1206,8 @@ TclPeekEventQueued(
return 0;
}
-
+
+
/*
*----------------------------------------------------------------------
*
@@ -1210,7 +1244,8 @@ TclSetTimerEventMarker(
};
}
}
-
+
+
/*
*----------------------------------------------------------------------
*
@@ -1234,7 +1269,8 @@ Tcl_GetServiceMode(void)
return tsdPtr->serviceMode;
}
-
+
+
/*
*----------------------------------------------------------------------
*
@@ -1264,7 +1300,8 @@ Tcl_SetServiceMode(
Tcl_ServiceModeHook(mode);
return oldMode;
}
-
+
+
/*
*----------------------------------------------------------------------
*
@@ -1312,7 +1349,8 @@ Tcl_SetMaxBlockTime(
Tcl_SetTimer(&tsdPtr->blockTime);
}
}
-
+
+
/*
*----------------------------------------------------------------------
*
@@ -1523,7 +1561,8 @@ done:
tsdPtr->serviceLevel--;
return result;
}
-
+
+
/*
*----------------------------------------------------------------------
*
@@ -1595,7 +1634,8 @@ Tcl_ServiceAll(void)
tsdPtr->serviceMode = TCL_SERVICE_ALL;
return result;
}
-
+
+
/*
*----------------------------------------------------------------------
*
@@ -1634,7 +1674,8 @@ Tcl_ThreadAlert(
}
Tcl_MutexUnlock(&listLock);
}
-
+
+
/*
*----------------------------------------------------------------------
*
@@ -1657,7 +1698,8 @@ Tcl_Sleep(
{
TclpUSleep((Tcl_WideInt)ms * 1000);
}
-
+
+
/*
* Local Variables:
* mode: c