aboutsummaryrefslogtreecommitdiff
path: root/jim-eventloop.c
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2010-01-24 12:11:20 +1000
committerSteve Bennett <steveb@workware.net.au>2010-10-15 11:02:44 +1000
commit9652302fec62f76bf894c6b9eb849bda6994c293 (patch)
treeca40df6d8ea59c853066b7c5361238d8fdc6be49 /jim-eventloop.c
parenta7335808c5725934d81dbe68247b62a6ab08bf2f (diff)
downloadjimtcl-9652302fec62f76bf894c6b9eb849bda6994c293.zip
jimtcl-9652302fec62f76bf894c6b9eb849bda6994c293.tar.gz
jimtcl-9652302fec62f76bf894c6b9eb849bda6994c293.tar.bz2
Various general fixes and cleanups
Add lsearch -command, update case to use lsearch Rename tcl6.tcl to tclcompat.tcl Remove // style comments Expand some tabs to spaces Fix some compiler warnings Remove some unused functions Don't close fd=-1 in exec
Diffstat (limited to 'jim-eventloop.c')
-rw-r--r--jim-eventloop.c127
1 files changed, 51 insertions, 76 deletions
diff --git a/jim-eventloop.c b/jim-eventloop.c
index 60cafbb..b7520bb 100644
--- a/jim-eventloop.c
+++ b/jim-eventloop.c
@@ -45,17 +45,8 @@
* - Win32 port
*/
-#define JIM_EXTENSION
-#define __JIM_EVENTLOOP_CORE__
-#ifdef __ECOS
-#include <pkgconf/jimtcl.h>
-#include <sys/time.h>
-#include <cyg/jimtcl/jim.h>
-#include <cyg/jimtcl/jim-eventloop.h>
-#else
#include "jim.h"
#include "jim-eventloop.h"
-#endif
/* POSIX includes */
#include <sys/time.h>
@@ -63,7 +54,6 @@
#include <unistd.h>
#include <sys/select.h>
#include <errno.h>
- extern int errno;
/* --- */
/* File event structure */
@@ -79,7 +69,7 @@ typedef struct Jim_FileEvent {
/* Time event structure */
typedef struct Jim_TimeEvent {
jim_wide id; /* time event identifier. */
- int mode; /* restart, repetitive .. UK */
+ int mode; /* restart, repetitive .. UK */
long initialms; /* initial relativ timer value UK */
long when_sec; /* seconds */
long when_ms; /* milliseconds */
@@ -103,7 +93,6 @@ void Jim_CreateFileHandler(Jim_Interp *interp, void *handle, int mask,
Jim_FileEvent *fe;
Jim_EventLoop *eventLoop = Jim_GetAssocData(interp, "eventloop");
- // fprintf(stderr,"rein\n");
fe = Jim_Alloc(sizeof(*fe));
fe->handle = handle;
fe->mask = mask;
@@ -112,7 +101,6 @@ void Jim_CreateFileHandler(Jim_Interp *interp, void *handle, int mask,
fe->clientData = clientData;
fe->next = eventLoop->fileEventHead;
eventLoop->fileEventHead = fe;
- // fprintf(stderr,"raus\n");
}
void Jim_DeleteFileHandler(Jim_Interp *interp, void *handle)
@@ -137,16 +125,6 @@ void Jim_DeleteFileHandler(Jim_Interp *interp, void *handle)
}
}
-// The same for signals.
-void Jim_CreateSignalHandler(Jim_Interp *interp, int signum,
- Jim_FileProc *proc, void *clientData,
- Jim_EventFinalizerProc *finalizerProc)
-{
-}
-void Jim_DeleteSignalHandler(Jim_Interp *interp, int signum)
-{
-}
-
/* That's another part of this extension that needs to be ported
* to WIN32. */
static void JimGetTime(long *seconds, long *milliseconds)
@@ -197,13 +175,14 @@ jim_wide Jim_DeleteTimeHandler(Jim_Interp *interp, jim_wide id)
JimGetTime(&cur_sec, &cur_ms);
te = eventLoop->timeEventHead;
- if (id >= eventLoop->timeEventNextId)
- return -2; /* wrong event ID */
+ if (id >= eventLoop->timeEventNextId) {
+ return -2; /* wrong event ID */
+ }
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 = (remain < 0) ? 0 : remain ;
if (prev == NULL)
eventLoop->timeEventHead = te->next;
@@ -229,7 +208,7 @@ static Jim_TimeEvent *JimSearchNearestTimer(Jim_EventLoop *eventLoop)
Jim_TimeEvent *te = eventLoop->timeEventHead;
Jim_TimeEvent *nearest = NULL;
- while(te) {
+ while (te) {
if (!nearest || te->when_sec < nearest->when_sec ||
(te->when_sec == nearest->when_sec &&
te->when_ms < nearest->when_ms))
@@ -284,6 +263,7 @@ int Jim_ProcessEvents(Jim_Interp *interp, int flags)
numfd++;
fe = fe->next;
}
+
/* Note that we want call select() even if there are no
* file events to process as long as we want to process time
* events, in order to sleep until the next time event is ready
@@ -292,7 +272,7 @@ int Jim_ProcessEvents(Jim_Interp *interp, int flags)
int retval;
Jim_TimeEvent *shortest;
struct timeval tv, *tvp;
- jim_wide dt;
+ jim_wide dt;
shortest = JimSearchNearestTimer(eventLoop);
if (shortest) {
@@ -302,33 +282,25 @@ int Jim_ProcessEvents(Jim_Interp *interp, int flags)
* timer to fire. */
JimGetTime(&now_sec, &now_ms);
tvp = &tv;
- dt = 1000 * (shortest->when_sec - now_sec);
- dt += ( shortest->when_ms - now_ms);
+ dt = 1000 * (shortest->when_sec - now_sec);
+ dt += ( shortest->when_ms - now_ms);
if (dt < 0) {
- dt = 1;
- }
- tvp->tv_sec = dt / 1000;
- tvp->tv_usec = dt % 1000;
- // fprintf(stderr,"Next %d.% 8d\n",(int)tvp->tv_sec,(int)tvp->tv_usec);
+ dt = 1;
+ }
+ tvp->tv_sec = dt / 1000;
+ tvp->tv_usec = dt % 1000;
} else {
tvp = NULL; /* wait forever */
- // fprintf(stderr,"No Event\n");
}
retval = select(maxfd+1, &rfds, &wfds, &efds, tvp);
if (retval < 0) {
- switch (errno) {
- case EINTR: fprintf(stderr,"select EINTR\n"); break;
- case EINVAL: fprintf(stderr,"select EINVAL\n"); break;
- case ENOMEM: fprintf(stderr,"select ENOMEM\n"); break;
- }
- } else if (retval > 0) {
+ /* XXX: Consider errno? EINTR? */
+ } else if (retval > 0) {
fe = eventLoop->fileEventHead;
while(fe != NULL) {
int fd = fileno(fe->handle);
- // fprintf(stderr,"fd: %d mask: %02x \n",fd,fe->mask);
-
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)))
@@ -363,6 +335,7 @@ int Jim_ProcessEvents(Jim_Interp *interp, int flags)
}
}
}
+
/* Check time events */
te = eventLoop->timeEventHead;
maxId = eventLoop->timeEventNextId-1;
@@ -395,6 +368,7 @@ int Jim_ProcessEvents(Jim_Interp *interp, int flags)
return processed;
}
+
/* ---------------------------------------------------------------------- */
void JimELAssocDataDeleProc(Jim_Interp *interp, void *data)
@@ -481,41 +455,42 @@ static int JimELAfterCommand(Jim_Interp *interp, int argc,
Jim_WrongNumArgs(interp, 1, argv, "<after milliseconds> script|cancel <id>");
return JIM_ERR;
}
- if (Jim_GetWide(interp, argv[1], &ms) != JIM_OK)
+ if (Jim_GetWide(interp, argv[1], &ms) != JIM_OK) {
if (Jim_GetEnum(interp, argv[1], options, &option, "after options",
- JIM_ERRMSG) != JIM_OK)
+ JIM_ERRMSG) != JIM_OK) {
return JIM_ERR;
+ }
+ }
switch (option) {
- case CREATE:
- Jim_IncrRefCount(argv[2]);
- id = Jim_CreateTimeHandler(interp, ms, JimAfterTimeHandler, argv[2],
- JimAfterTimeEventFinalizer);
- objPtr = Jim_NewStringObj(interp, NULL, 0);
- Jim_AppendString(interp, objPtr, "after#", -1);
- idObjPtr = Jim_NewIntObj(interp, id);
- Jim_IncrRefCount(idObjPtr);
- Jim_AppendObj(interp, objPtr, idObjPtr);
- 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 (sscanf(tok,"after#%" JIM_WIDE_MODIFIER, &id) == 1) {
- 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;
- }
- default:
- fprintf(stderr,"unserviced option to after %d\n",option);
- }
+ case CREATE:
+ Jim_IncrRefCount(argv[2]);
+ id = Jim_CreateTimeHandler(interp, ms, JimAfterTimeHandler, argv[2],
+ JimAfterTimeEventFinalizer);
+ objPtr = Jim_NewStringObj(interp, NULL, 0);
+ Jim_AppendString(interp, objPtr, "after#", -1);
+ idObjPtr = Jim_NewIntObj(interp, id);
+ Jim_IncrRefCount(idObjPtr);
+ Jim_AppendObj(interp, objPtr, idObjPtr);
+ 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 ( sscanf(tok,"after#%lld",&id) == 1) {
+ 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;
+ }
+ default:
+ fprintf(stderr,"unserviced option to after %d\n",option);
+ }
return JIM_OK;
}