aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2016-03-28 11:50:23 +1000
committerSteve Bennett <steveb@workware.net.au>2016-08-17 16:14:07 +1000
commitf2afd7b85c5a9b527bcbd4f66a5d65ed282d0012 (patch)
treedc6f7eaba4ed39962a6fa1207bd28f4401629c71
parente6c96671d963a6770f45b92519891a86c629dca7 (diff)
downloadjimtcl-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.c6
-rw-r--r--jim-eventloop.c29
-rw-r--r--jim-eventloop.h4
3 files changed, 19 insertions, 20 deletions
diff --git a/jim-aio.c b/jim-aio.c
index cefcaf8..8a96f27 100644
--- a/jim-aio.c
+++ b/jim-aio.c
@@ -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,