diff options
author | Steve Bennett <steveb@workware.net.au> | 2016-03-28 11:50:23 +1000 |
---|---|---|
committer | Steve Bennett <steveb@workware.net.au> | 2016-08-17 16:14:07 +1000 |
commit | f2afd7b85c5a9b527bcbd4f66a5d65ed282d0012 (patch) | |
tree | dc6f7eaba4ed39962a6fa1207bd28f4401629c71 | |
parent | e6c96671d963a6770f45b92519891a86c629dca7 (diff) | |
download | jimtcl-f2afd7b85c5a9b527bcbd4f66a5d65ed282d0012.zip jimtcl-f2afd7b85c5a9b527bcbd4f66a5d65ed282d0012.tar.gz jimtcl-f2afd7b85c5a9b527bcbd4f66a5d65ed282d0012.tar.bz2 |
eventloop: Switch to using fd for eventloop
eventloop doesn't need a filehandle, so so simplify the interface
by using file descriptors instead
Signed-off-by: Steve Bennett <steveb@workware.net.au>
-rw-r--r-- | jim-aio.c | 6 | ||||
-rw-r--r-- | jim-eventloop.c | 29 | ||||
-rw-r--r-- | jim-eventloop.h | 4 |
3 files changed, 19 insertions, 20 deletions
@@ -481,7 +481,7 @@ static void JimAioDelProc(Jim_Interp *interp, void *privData) #ifdef jim_ext_eventloop /* remove all existing EventHandlers */ - Jim_DeleteFileHandler(interp, af->fp, JIM_EVENT_READABLE | JIM_EVENT_WRITABLE | JIM_EVENT_EXCEPTION); + Jim_DeleteFileHandler(interp, af->fd, JIM_EVENT_READABLE | JIM_EVENT_WRITABLE | JIM_EVENT_EXCEPTION); #endif #if defined(JIM_SSL) @@ -1012,7 +1012,7 @@ static int aio_eventinfo(Jim_Interp *interp, AioFile * af, unsigned mask, Jim_Ob if (*scriptHandlerObj) { /* Delete old handler */ - Jim_DeleteFileHandler(interp, af->fp, mask); + Jim_DeleteFileHandler(interp, af->fd, mask); } /* Now possibly add the new script(s) */ @@ -1025,7 +1025,7 @@ static int aio_eventinfo(Jim_Interp *interp, AioFile * af, unsigned mask, Jim_Ob Jim_IncrRefCount(argv[0]); *scriptHandlerObj = argv[0]; - Jim_CreateFileHandler(interp, af->fp, mask, + Jim_CreateFileHandler(interp, af->fd, mask, JimAioFileEventHandler, scriptHandlerObj, JimAioFileEventFinalizer); return JIM_OK; diff --git a/jim-eventloop.c b/jim-eventloop.c index 22ca5ff..1bbd171 100644 --- a/jim-eventloop.c +++ b/jim-eventloop.c @@ -71,7 +71,7 @@ /* File event structure */ typedef struct Jim_FileEvent { - FILE *handle; + int fd; int mask; /* one of JIM_EVENT_(READABLE|WRITABLE|EXCEPTION) */ Jim_FileProc *fileProc; Jim_EventFinalizerProc *finalizerProc; @@ -143,14 +143,14 @@ int Jim_EvalObjBackground(Jim_Interp *interp, Jim_Obj *scriptObjPtr) } -void Jim_CreateFileHandler(Jim_Interp *interp, FILE * handle, int mask, +void Jim_CreateFileHandler(Jim_Interp *interp, int fd, int mask, Jim_FileProc * proc, void *clientData, Jim_EventFinalizerProc * finalizerProc) { Jim_FileEvent *fe; Jim_EventLoop *eventLoop = Jim_GetAssocData(interp, "eventloop"); fe = Jim_Alloc(sizeof(*fe)); - fe->handle = handle; + fe->fd = fd; fe->mask = mask; fe->fileProc = proc; fe->finalizerProc = finalizerProc; @@ -162,14 +162,14 @@ void Jim_CreateFileHandler(Jim_Interp *interp, FILE * handle, int mask, /** * Removes all event handlers for 'handle' that match 'mask'. */ -void Jim_DeleteFileHandler(Jim_Interp *interp, FILE * handle, int mask) +void Jim_DeleteFileHandler(Jim_Interp *interp, int fd, int mask) { Jim_FileEvent *fe, *next, *prev = NULL; Jim_EventLoop *eventLoop = Jim_GetAssocData(interp, "eventloop"); for (fe = eventLoop->fileEventHead; fe; fe = next) { next = fe->next; - if (fe->handle == handle && (fe->mask & mask)) { + if (fe->fd == fd && (fe->mask & mask)) { /* Remove this entry from the list */ if (prev == NULL) eventLoop->fileEventHead = next; @@ -389,16 +389,14 @@ int Jim_ProcessEvents(Jim_Interp *interp, int flags) /* Check file events */ while (fe != NULL) { - int fd = fileno(fe->handle); - if (fe->mask & JIM_EVENT_READABLE) - FD_SET(fd, &rfds); + FD_SET(fe->fd, &rfds); if (fe->mask & JIM_EVENT_WRITABLE) - FD_SET(fd, &wfds); + FD_SET(fe->fd, &wfds); if (fe->mask & JIM_EVENT_EXCEPTION) - FD_SET(fd, &efds); - if (maxfd < fd) - maxfd = fd; + FD_SET(fe->fd, &efds); + if (maxfd < fe->fd) + maxfd = fe->fd; fe = fe->next; } @@ -420,8 +418,8 @@ int Jim_ProcessEvents(Jim_Interp *interp, int flags) else if (retval > 0) { fe = eventLoop->fileEventHead; while (fe != NULL) { - int fd = fileno(fe->handle); int mask = 0; + int fd = fe->fd; if ((fe->mask & JIM_EVENT_READABLE) && FD_ISSET(fd, &rfds)) mask |= JIM_EVENT_READABLE; @@ -433,17 +431,18 @@ 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, mask); + Jim_DeleteFileHandler(interp, fd, mask); + /* At this point fe is no longer valid - it will be assigned below */ } processed++; /* After an event is processed our file event list * may no longer be the same, so what we do * is to clear the bit for this file descriptor and * restart again from the head. */ - fe = eventLoop->fileEventHead; FD_CLR(fd, &rfds); FD_CLR(fd, &wfds); FD_CLR(fd, &efds); + fe = eventLoop->fileEventHead; } else { fe = fe->next; diff --git a/jim-eventloop.h b/jim-eventloop.h index 3e20e6f..545ef4d 100644 --- a/jim-eventloop.h +++ b/jim-eventloop.h @@ -61,11 +61,11 @@ typedef void Jim_EventFinalizerProc(Jim_Interp *interp, void *clientData); #define JIM_EVENT_EXCEPTION 4 JIM_EXPORT void Jim_CreateFileHandler (Jim_Interp *interp, - FILE *handle, int mask, + int fd, int mask, Jim_FileProc *proc, void *clientData, Jim_EventFinalizerProc *finalizerProc); JIM_EXPORT void Jim_DeleteFileHandler (Jim_Interp *interp, - FILE *handle, int mask); + int fd, int mask); JIM_EXPORT jim_wide Jim_CreateTimeHandler (Jim_Interp *interp, jim_wide milliseconds, Jim_TimeProc *proc, void *clientData, |