aboutsummaryrefslogtreecommitdiff
path: root/jim-eventloop.c
diff options
context:
space:
mode:
Diffstat (limited to 'jim-eventloop.c')
-rw-r--r--jim-eventloop.c175
1 files changed, 90 insertions, 85 deletions
diff --git a/jim-eventloop.c b/jim-eventloop.c
index 1104b66..7c17ec8 100644
--- a/jim-eventloop.c
+++ b/jim-eventloop.c
@@ -1,3 +1,4 @@
+
/* Jim - A small embeddable Tcl interpreter
*
* Copyright 2005 Salvatore Sanfilippo <antirez@invece.org>
@@ -38,6 +39,7 @@
* are those of the authors and should not be interpreted as representing
* official policies, either expressed or implied, of the Jim Tcl Project.
**/
+
/* TODO:
*
* - to really use flags in Jim_ProcessEvents()
@@ -55,12 +57,14 @@
#include <unistd.h>
#include <sys/select.h>
#include <errno.h>
+
/* --- */
/* File event structure */
-typedef struct Jim_FileEvent {
+typedef struct Jim_FileEvent
+{
FILE *handle;
- int mask; /* one of JIM_EVENT_(READABLE|WRITABLE|EXCEPTION) */
+ int mask; /* one of JIM_EVENT_(READABLE|WRITABLE|EXCEPTION) */
Jim_FileProc *fileProc;
Jim_EventFinalizerProc *finalizerProc;
void *clientData;
@@ -68,12 +72,13 @@ typedef struct Jim_FileEvent {
} Jim_FileEvent;
/* Time event structure */
-typedef struct Jim_TimeEvent {
- jim_wide id; /* time event identifier. */
- int mode; /* restart, repetitive .. UK */
- long initialms; /* initial relativ timer value UK */
- long when_sec; /* seconds */
- long when_ms; /* milliseconds */
+typedef struct Jim_TimeEvent
+{
+ jim_wide id; /* time event identifier. */
+ int mode; /* restart, repetitive .. UK */
+ long initialms; /* initial relativ timer value UK */
+ long when_sec; /* seconds */
+ long when_ms; /* milliseconds */
Jim_TimeProc *timeProc;
Jim_EventFinalizerProc *finalizerProc;
void *clientData;
@@ -81,15 +86,15 @@ typedef struct Jim_TimeEvent {
} Jim_TimeEvent;
/* Per-interp stucture containing the state of the event loop */
-typedef struct Jim_EventLoop {
+typedef struct Jim_EventLoop
+{
jim_wide timeEventNextId;
Jim_FileEvent *fileEventHead;
Jim_TimeEvent *timeEventHead;
} Jim_EventLoop;
-void Jim_CreateFileHandler(Jim_Interp *interp, FILE *handle, int mask,
- Jim_FileProc *proc, void *clientData,
- Jim_EventFinalizerProc *finalizerProc)
+void Jim_CreateFileHandler(Jim_Interp *interp, FILE * handle, int mask,
+ Jim_FileProc * proc, void *clientData, Jim_EventFinalizerProc * finalizerProc)
{
Jim_FileEvent *fe;
Jim_EventLoop *eventLoop = Jim_GetAssocData(interp, "eventloop");
@@ -104,13 +109,13 @@ void Jim_CreateFileHandler(Jim_Interp *interp, FILE *handle, int mask,
eventLoop->fileEventHead = fe;
}
-void Jim_DeleteFileHandler(Jim_Interp *interp, FILE *handle)
+void Jim_DeleteFileHandler(Jim_Interp *interp, FILE * handle)
{
Jim_FileEvent *fe, *prev = NULL;
Jim_EventLoop *eventLoop = Jim_GetAssocData(interp, "eventloop");
fe = eventLoop->fileEventHead;
- while(fe) {
+ while (fe) {
if (fe->handle == handle) {
if (prev == NULL)
eventLoop->fileEventHead = fe->next;
@@ -134,12 +139,11 @@ static void JimGetTime(long *seconds, long *milliseconds)
gettimeofday(&tv, NULL);
*seconds = tv.tv_sec;
- *milliseconds = tv.tv_usec/1000;
+ *milliseconds = tv.tv_usec / 1000;
}
jim_wide Jim_CreateTimeHandler(Jim_Interp *interp, jim_wide milliseconds,
- Jim_TimeProc *proc, void *clientData,
- Jim_EventFinalizerProc *finalizerProc)
+ Jim_TimeProc * proc, void *clientData, Jim_EventFinalizerProc * finalizerProc)
{
Jim_EventLoop *eventLoop = Jim_GetAssocData(interp, "eventloop");
jim_wide id = eventLoop->timeEventNextId++;
@@ -152,10 +156,10 @@ jim_wide Jim_CreateTimeHandler(Jim_Interp *interp, jim_wide milliseconds,
te->id = id;
te->mode = 0;
te->initialms = milliseconds;
- te->when_sec = cur_sec + milliseconds/1000;
- te->when_ms = cur_ms + milliseconds%1000;
+ te->when_sec = cur_sec + milliseconds / 1000;
+ te->when_ms = cur_ms + milliseconds % 1000;
if (te->when_ms >= 1000) {
- te->when_sec ++;
+ te->when_sec++;
te->when_ms -= 1000;
}
te->timeProc = proc;
@@ -171,19 +175,19 @@ jim_wide Jim_DeleteTimeHandler(Jim_Interp *interp, jim_wide id)
Jim_TimeEvent *te, *prev = NULL;
Jim_EventLoop *eventLoop = Jim_GetAssocData(interp, "eventloop");
long cur_sec, cur_ms;
- jim_wide remain ;
+ jim_wide remain;
JimGetTime(&cur_sec, &cur_ms);
te = eventLoop->timeEventHead;
if (id >= eventLoop->timeEventNextId) {
- return -2; /* wrong event ID */
+ return -2; /* wrong event ID */
}
- while(te) {
+ while (te) {
if (te->id == id) {
- remain = (te->when_sec - cur_sec) * 1000;
- remain += (te->when_ms - cur_ms) ;
- remain = (remain < 0) ? 0 : remain ;
+ remain = (te->when_sec - cur_sec) * 1000;
+ remain += (te->when_ms - cur_ms);
+ remain = (remain < 0) ? 0 : remain;
if (prev == NULL)
eventLoop->timeEventHead = te->next;
@@ -197,22 +201,21 @@ jim_wide Jim_DeleteTimeHandler(Jim_Interp *interp, jim_wide id)
prev = te;
te = te->next;
}
- return -1; /* NO event with the specified ID found */
+ return -1; /* NO event with the specified ID found */
}
/* Search the first timer to fire.
* This operation is useful to know how many time the select can be
* put in sleep without to delay any event.
* If there are no timers NULL is returned. */
-static Jim_TimeEvent *JimSearchNearestTimer(Jim_EventLoop *eventLoop)
+static Jim_TimeEvent *JimSearchNearestTimer(Jim_EventLoop * eventLoop)
{
Jim_TimeEvent *te = eventLoop->timeEventHead;
Jim_TimeEvent *nearest = NULL;
while (te) {
if (!nearest || te->when_sec < nearest->when_sec ||
- (te->when_sec == nearest->when_sec &&
- te->when_ms < nearest->when_ms))
+ (te->when_sec == nearest->when_sec && te->when_ms < nearest->when_ms))
nearest = te;
te = te->next;
}
@@ -242,6 +245,7 @@ int Jim_ProcessEvents(Jim_Interp *interp, int flags)
Jim_FileEvent *fe = eventLoop->fileEventHead;
Jim_TimeEvent *te;
jim_wide maxId;
+
JIM_NOTUSED(flags);
FD_ZERO(&rfds);
@@ -252,11 +256,14 @@ int Jim_ProcessEvents(Jim_Interp *interp, int flags)
while (fe != NULL) {
int fd = fileno(fe->handle);
- if (fe->mask & JIM_EVENT_READABLE)
- FD_SET(fd, &rfds);
- if (fe->mask & JIM_EVENT_WRITABLE) FD_SET(fd, &wfds);
- if (fe->mask & JIM_EVENT_EXCEPTION) FD_SET(fd, &efds);
- if (maxfd < fd) maxfd = fd;
+ if (fe->mask & JIM_EVENT_READABLE)
+ FD_SET(fd, &rfds);
+ if (fe->mask & JIM_EVENT_WRITABLE)
+ FD_SET(fd, &wfds);
+ if (fe->mask & JIM_EVENT_EXCEPTION)
+ FD_SET(fd, &efds);
+ if (maxfd < fd)
+ maxfd = fd;
numfd++;
fe = fe->next;
}
@@ -280,35 +287,36 @@ int Jim_ProcessEvents(Jim_Interp *interp, int flags)
JimGetTime(&now_sec, &now_ms);
tvp = &tv;
dt = 1000 * (shortest->when_sec - now_sec);
- dt += ( shortest->when_ms - now_ms);
+ dt += (shortest->when_ms - now_ms);
if (dt < 0) {
dt = 1;
}
- tvp->tv_sec = dt / 1000;
+ tvp->tv_sec = dt / 1000;
tvp->tv_usec = dt % 1000;
- } else {
- tvp = NULL; /* wait forever */
+ }
+ else {
+ tvp = NULL; /* wait forever */
}
- retval = select(maxfd+1, &rfds, &wfds, &efds, tvp);
+ retval = select(maxfd + 1, &rfds, &wfds, &efds, tvp);
if (retval < 0) {
/* XXX: Consider errno? EINTR? */
- } else if (retval > 0) {
+ }
+ else if (retval > 0) {
fe = eventLoop->fileEventHead;
- while(fe != NULL) {
+ while (fe != NULL) {
int fd = fileno(fe->handle);
if ((fe->mask & JIM_EVENT_READABLE && FD_ISSET(fd, &rfds)) ||
(fe->mask & JIM_EVENT_WRITABLE && FD_ISSET(fd, &wfds)) ||
- (fe->mask & JIM_EVENT_EXCEPTION && FD_ISSET(fd, &efds)))
- {
+ (fe->mask & JIM_EVENT_EXCEPTION && FD_ISSET(fd, &efds))) {
int mask = 0;
if ((fe->mask & JIM_EVENT_READABLE) && FD_ISSET(fd, &rfds)) {
mask |= JIM_EVENT_READABLE;
- if ((fe->mask & JIM_EVENT_FEOF) && feof(fe->handle))
- mask |= JIM_EVENT_FEOF;
- }
+ if ((fe->mask & JIM_EVENT_FEOF) && feof(fe->handle))
+ mask |= JIM_EVENT_FEOF;
+ }
if (fe->mask & JIM_EVENT_WRITABLE && FD_ISSET(fd, &wfds))
mask |= JIM_EVENT_WRITABLE;
if (fe->mask & JIM_EVENT_EXCEPTION && FD_ISSET(fd, &efds))
@@ -326,7 +334,8 @@ int Jim_ProcessEvents(Jim_Interp *interp, int flags)
FD_CLR(fd, &rfds);
FD_CLR(fd, &wfds);
FD_CLR(fd, &efds);
- } else {
+ }
+ else {
fe = fe->next;
}
}
@@ -335,8 +344,8 @@ int Jim_ProcessEvents(Jim_Interp *interp, int flags)
/* Check time events */
te = eventLoop->timeEventHead;
- maxId = eventLoop->timeEventNextId-1;
- while(te) {
+ maxId = eventLoop->timeEventNextId - 1;
+ while (te) {
long now_sec, now_ms;
jim_wide id;
@@ -345,9 +354,7 @@ int Jim_ProcessEvents(Jim_Interp *interp, int flags)
continue;
}
JimGetTime(&now_sec, &now_ms);
- if (now_sec > te->when_sec ||
- (now_sec == te->when_sec && now_ms >= te->when_ms))
- {
+ if (now_sec > te->when_sec || (now_sec == te->when_sec && now_ms >= te->when_ms)) {
id = te->id;
te->timeProc(interp, te->clientData);
/* After an event is processed our time event list may
@@ -358,7 +365,8 @@ int Jim_ProcessEvents(Jim_Interp *interp, int flags)
* itself. To do so we saved the max ID we want to handle. */
Jim_DeleteTimeHandler(interp, id);
te = eventLoop->timeEventHead;
- } else {
+ }
+ else {
te = te->next;
}
}
@@ -376,7 +384,7 @@ void JimELAssocDataDeleProc(Jim_Interp *interp, void *data)
Jim_EventLoop *eventLoop = data;
fe = eventLoop->fileEventHead;
- while(fe) {
+ while (fe) {
next = fe->next;
if (fe->finalizerProc)
fe->finalizerProc(interp, fe->clientData);
@@ -385,7 +393,7 @@ void JimELAssocDataDeleProc(Jim_Interp *interp, void *data)
}
te = eventLoop->timeEventHead;
- while(te) {
+ while (te) {
next = te->next;
if (te->finalizerProc)
te->finalizerProc(interp, te->clientData);
@@ -395,8 +403,7 @@ void JimELAssocDataDeleProc(Jim_Interp *interp, void *data)
Jim_Free(data);
}
-static int JimELVwaitCommand(Jim_Interp *interp, int argc,
- Jim_Obj *const *argv)
+static int JimELVwaitCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
{
Jim_Obj *oldValue;
@@ -405,7 +412,8 @@ static int JimELVwaitCommand(Jim_Interp *interp, int argc,
return JIM_ERR;
}
oldValue = Jim_GetGlobalVariable(interp, argv[1], JIM_NONE);
- if (oldValue) Jim_IncrRefCount(oldValue);
+ if (oldValue)
+ Jim_IncrRefCount(oldValue);
while (1) {
Jim_Obj *currValue;
@@ -415,11 +423,11 @@ static int JimELVwaitCommand(Jim_Interp *interp, int argc,
* or if was unset and now is set (or the contrary). */
if ((oldValue && !currValue) ||
(!oldValue && currValue) ||
- (oldValue && currValue &&
- !Jim_StringEqObj(oldValue, currValue, JIM_CASESENS)))
+ (oldValue && currValue && !Jim_StringEqObj(oldValue, currValue, JIM_CASESENS)))
break;
}
- if (oldValue) Jim_DecrRefCount(interp, oldValue);
+ if (oldValue)
+ Jim_DecrRefCount(interp, oldValue);
return JIM_OK;
}
@@ -437,24 +445,23 @@ void JimAfterTimeEventFinalizer(Jim_Interp *interp, void *clientData)
Jim_DecrRefCount(interp, objPtr);
}
-static int JimELAfterCommand(Jim_Interp *interp, int argc,
- Jim_Obj *const *argv)
+static int JimELAfterCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
{
jim_wide ms, id;
Jim_Obj *objPtr, *idObjPtr;
const char *options[] = {
"info", "cancel", NULL
};
- enum {INFO, CANCEL, RESTART, EXPIRE, CREATE };
- int option = CREATE ;
+ enum
+ { INFO, CANCEL, RESTART, EXPIRE, CREATE };
+ int option = CREATE;
if (argc < 3) {
Jim_WrongNumArgs(interp, 1, argv, "<after milliseconds> script|cancel <id>");
return JIM_ERR;
}
if (Jim_GetWide(interp, argv[1], &ms) != JIM_OK) {
- if (Jim_GetEnum(interp, argv[1], options, &option, "after options",
- JIM_ERRMSG) != JIM_OK) {
+ if (Jim_GetEnum(interp, argv[1], options, &option, "after options", JIM_ERRMSG) != JIM_OK) {
return JIM_ERR;
}
}
@@ -462,7 +469,7 @@ static int JimELAfterCommand(Jim_Interp *interp, int argc,
case CREATE:
Jim_IncrRefCount(argv[2]);
id = Jim_CreateTimeHandler(interp, ms, JimAfterTimeHandler, argv[2],
- JimAfterTimeEventFinalizer);
+ JimAfterTimeEventFinalizer);
objPtr = Jim_NewStringObj(interp, NULL, 0);
Jim_AppendString(interp, objPtr, "after#", -1);
idObjPtr = Jim_NewIntObj(interp, id);
@@ -471,22 +478,23 @@ static int JimELAfterCommand(Jim_Interp *interp, int argc,
Jim_DecrRefCount(interp, idObjPtr);
Jim_SetResult(interp, objPtr);
return JIM_OK;
- case CANCEL: {
- int tlen ;
- jim_wide remain = 0;
- const char *tok = Jim_GetString(argv[2], &tlen);
- if (strncmp(tok, "after#", 6) == 0 && Jim_StringToWide(tok + 6, &id, 10) == JIM_OK) {
- remain = Jim_DeleteTimeHandler(interp, id);
- if (remain > -2) {
- Jim_SetResult(interp, Jim_NewIntObj(interp, remain));
- return JIM_OK;
+ case CANCEL:{
+ int tlen;
+ jim_wide remain = 0;
+ const char *tok = Jim_GetString(argv[2], &tlen);
+
+ if (strncmp(tok, "after#", 6) == 0 && Jim_StringToWide(tok + 6, &id, 10) == JIM_OK) {
+ remain = Jim_DeleteTimeHandler(interp, id);
+ if (remain > -2) {
+ Jim_SetResult(interp, Jim_NewIntObj(interp, remain));
+ return JIM_OK;
+ }
}
+ Jim_SetResultString(interp, "invalid event", -1);
+ return JIM_ERR;
}
- Jim_SetResultString(interp, "invalid event" , -1);
- return JIM_ERR;
- }
default:
- fprintf(stderr,"unserviced option to after %d\n",option);
+ fprintf(stderr, "unserviced option to after %d\n", option);
}
return JIM_OK;
}
@@ -495,9 +503,6 @@ int Jim_eventloopInit(Jim_Interp *interp)
{
Jim_EventLoop *eventLoop;
- if (Jim_PackageProvide(interp, "eventloop", "1.0", JIM_ERRMSG) != JIM_OK)
- return JIM_ERR;
-
eventLoop = Jim_Alloc(sizeof(*eventLoop));
eventLoop->fileEventHead = NULL;
eventLoop->timeEventHead = NULL;