aboutsummaryrefslogtreecommitdiff
path: root/jim-eventloop.c
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2020-11-15 10:42:30 +1000
committerSteve Bennett <steveb@workware.net.au>2020-11-15 20:04:43 +1000
commitc436661c19ac193007af0d2d878f554bad08f905 (patch)
tree7c0f1fa45f091e72dc9d578d39441d2fe758dd25 /jim-eventloop.c
parent939e88f7e49732167155568cbdd36ce38fb58053 (diff)
downloadjimtcl-c436661c19ac193007af0d2d878f554bad08f905.zip
jimtcl-c436661c19ac193007af0d2d878f554bad08f905.tar.gz
jimtcl-c436661c19ac193007af0d2d878f554bad08f905.tar.bz2
eventloop: Add convenience functions for adding script file handlers
Add Jim_CreateScriptFileHandler() to create a standard script filehandler event that evaluates the given script with Jim_EvalObjBackground() when the event occurs. Also add Jim_FindFileHandler() to find a registered event handler. Simplify aio by using these. Signed-off-by: Steve Bennett <steveb@workware.net.au>
Diffstat (limited to 'jim-eventloop.c')
-rw-r--r--jim-eventloop.c49
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'.
*/