diff options
Diffstat (limited to 'jim-eventloop.c')
-rw-r--r-- | jim-eventloop.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/jim-eventloop.c b/jim-eventloop.c index 78aae12..1a97191 100644 --- a/jim-eventloop.c +++ b/jim-eventloop.c @@ -148,6 +148,16 @@ int Jim_EvalObjBackground(Jim_Interp *interp, Jim_Obj *scriptObjPtr) } +/** + * Register a file event handler on the given file descriptor with the given mask + * (may be 1 or more of JIM_EVENT_xxx) + * + * When the event occurs, proc is called with clientData and the mask of events that occurred. + * When the filehandler is removed, finalizerProc is called. + * + * Note that no check is made that only one handler is registered for the given + * event(s). + */ void Jim_CreateFileHandler(Jim_Interp *interp, int fd, int mask, Jim_FileProc * proc, void *clientData, Jim_EventFinalizerProc * finalizerProc) { @@ -164,6 +174,45 @@ void Jim_CreateFileHandler(Jim_Interp *interp, int fd, int mask, eventLoop->fileEventHead = fe; } +static int JimEventHandlerScript(Jim_Interp *interp, void *clientData, int mask) +{ + return Jim_EvalObjBackground(interp, (Jim_Obj *)clientData); +} + +static void JimEventHandlerScriptFinalize(Jim_Interp *interp, void *clientData) +{ + Jim_DecrRefCount(interp, (Jim_Obj *)clientData); +} + +/** + * A convenience version of Jim_CreateFileHandler() which evaluates + * scriptObj with Jim_EvalObjBackground() when the event occurs. + */ +void Jim_CreateScriptFileHandler(Jim_Interp *interp, int fd, int mask, + Jim_Obj *scriptObj) +{ + Jim_IncrRefCount(scriptObj); + Jim_CreateFileHandler(interp, fd, mask, JimEventHandlerScript, scriptObj, JimEventHandlerScriptFinalize); +} + +/** + * If there is a file handler registered with the given mask, return the clientData + * for the (first) handler. + * Otherwise return NULL. + */ +void *Jim_FindFileHandler(Jim_Interp *interp, int fd, int mask) +{ + Jim_FileEvent *fe; + Jim_EventLoop *eventLoop = Jim_GetAssocData(interp, "eventloop"); + + for (fe = eventLoop->fileEventHead; fe; fe = fe->next) { + if (fe->fd == fd && (fe->mask & mask)) { + return fe->clientData; + } + } + return NULL; +} + /** * Removes all event handlers for 'handle' that match 'mask'. */ |