aboutsummaryrefslogtreecommitdiff
path: root/jim-eventloop.c
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2013-08-02 08:42:11 +1000
committerSteve Bennett <steveb@workware.net.au>2013-08-02 08:44:05 +1000
commita9fe2942a09523c248e64d080f8e3b38d3a34f19 (patch)
tree5be808a32bb42f3ec98cdfb6e8d8b647b462651d /jim-eventloop.c
parent7c126ab08220024b7dfe293045e6ee4d0bb3ca95 (diff)
downloadjimtcl-a9fe2942a09523c248e64d080f8e3b38d3a34f19.zip
jimtcl-a9fe2942a09523c248e64d080f8e3b38d3a34f19.tar.gz
jimtcl-a9fe2942a09523c248e64d080f8e3b38d3a34f19.tar.bz2
Correct file handler should be deleted
Previously, Jim_DeleteFileHandler() would indiscriminately delete the first matching file handler in the list. Instead, it should delete the file handler matching the event mask. Signed-off-by: Steve Bennett <steveb@workware.net.au>
Diffstat (limited to 'jim-eventloop.c')
-rw-r--r--jim-eventloop.c23
1 files changed, 13 insertions, 10 deletions
diff --git a/jim-eventloop.c b/jim-eventloop.c
index ac45eb5..5681b00 100644
--- a/jim-eventloop.c
+++ b/jim-eventloop.c
@@ -160,25 +160,28 @@ void Jim_CreateFileHandler(Jim_Interp *interp, FILE * handle, int mask,
eventLoop->fileEventHead = fe;
}
-void Jim_DeleteFileHandler(Jim_Interp *interp, FILE * handle)
+/**
+ * Removes all event handlers for 'handle' that match 'mask'.
+ */
+void Jim_DeleteFileHandler(Jim_Interp *interp, FILE * handle, int mask)
{
- Jim_FileEvent *fe, *prev = NULL;
+ Jim_FileEvent *fe, *next, *prev = NULL;
Jim_EventLoop *eventLoop = Jim_GetAssocData(interp, "eventloop");
- fe = eventLoop->fileEventHead;
- while (fe) {
- if (fe->handle == handle) {
+ for (fe = eventLoop->fileEventHead; fe; fe = next) {
+ if (fe->handle == handle && (fe->mask & mask)) {
+ /* Remove this entry from the list */
if (prev == NULL)
- eventLoop->fileEventHead = fe->next;
+ next = eventLoop->fileEventHead = fe->next;
else
- prev->next = fe->next;
+ next = prev->next = fe->next;
if (fe->finalizerProc)
fe->finalizerProc(interp, fe->clientData);
Jim_Free(fe);
- return;
+ continue;
}
prev = fe;
- fe = fe->next;
+ next = fe->next;
}
}
@@ -448,7 +451,7 @@ int Jim_ProcessEvents(Jim_Interp *interp, int flags)
if (mask) {
if (fe->fileProc(interp, fe->clientData, mask) != JIM_OK) {
/* Remove the element on handler error */
- Jim_DeleteFileHandler(interp, fe->handle);
+ Jim_DeleteFileHandler(interp, fe->handle, mask);
}
processed++;
/* After an event is processed our file event list