diff options
author | Steve Bennett <steveb@workware.net.au> | 2013-08-02 08:42:11 +1000 |
---|---|---|
committer | Steve Bennett <steveb@workware.net.au> | 2013-08-02 08:44:05 +1000 |
commit | a9fe2942a09523c248e64d080f8e3b38d3a34f19 (patch) | |
tree | 5be808a32bb42f3ec98cdfb6e8d8b647b462651d /jim-eventloop.c | |
parent | 7c126ab08220024b7dfe293045e6ee4d0bb3ca95 (diff) | |
download | jimtcl-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.c | 23 |
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 |