Skip to content

Commit b9f8342

Browse files
committed
eventloop: Add support for vwait script
An additional arg to vwait is now supported: vwait ?-signal? var ?script? If the script is given it is evaluated on every event. If the script returns a break or error code, the vwait terminates. This approach makes it easier to avoid using global variables to control the eventloop. Signed-off-by: Steve Bennett <[email protected]>
1 parent 972d93d commit b9f8342

File tree

1 file changed

+22
-5
lines changed

1 file changed

+22
-5
lines changed

jim-eventloop.c

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -564,19 +564,24 @@ static void JimELAssocDataDeleProc(Jim_Interp *interp, void *data)
564564
static int JimELVwaitCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
565565
{
566566
Jim_EventLoop *eventLoop = Jim_CmdPrivData(interp);
567-
Jim_Obj *oldValue;
567+
Jim_Obj *oldValue = NULL;
568+
Jim_Obj *scriptObjPtr = NULL;
568569
int rc;
569570
int signal = 0;
570571

571-
if (argc == 3 && Jim_CompareStringImmediate(interp, argv[1], "-signal")) {
572+
if (argc > 2 && Jim_CompareStringImmediate(interp, argv[1], "-signal")) {
572573
signal++;
573574
}
574575

575-
if (argc - signal != 2) {
576+
if (argc - signal == 3) {
577+
scriptObjPtr = argv[2 + signal];
578+
}
579+
else if (argc - signal != 2) {
576580
return JIM_USAGE;
577581
}
578582

579583
oldValue = Jim_GetGlobalVariable(interp, argv[1 + signal], JIM_NONE);
584+
580585
if (oldValue) {
581586
Jim_IncrRefCount(oldValue);
582587
}
@@ -590,6 +595,8 @@ static int JimELVwaitCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
590595
eventLoop->suppress_bgerror = 0;
591596

592597
while ((rc = Jim_ProcessEvents(interp, JIM_ALL_EVENTS)) >= 0) {
598+
Jim_Obj *currValue;
599+
593600
if (signal && interp->sigmask) {
594601
/* vwait -signal and handled signals were received, so transfer them
595602
* to ignored signals so that 'signal check -clear' will return them.
@@ -602,7 +609,7 @@ static int JimELVwaitCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
602609
interp->sigmask = 0;
603610
break;
604611
}
605-
Jim_Obj *currValue;
612+
606613
currValue = Jim_GetGlobalVariable(interp, argv[1 + signal], JIM_NONE);
607614
/* Stop the loop if the vwait-ed variable changed value,
608615
* or if was unset and now is set (or the contrary)
@@ -614,6 +621,16 @@ static int JimELVwaitCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
614621
Jim_CheckSignal(interp)) {
615622
break;
616623
}
624+
if (scriptObjPtr) {
625+
/* Stop the loop if a provided script returns BREAK or ERR */
626+
int retval = Jim_EvalObj(interp, scriptObjPtr);
627+
if (retval == JIM_ERR || retval == JIM_BREAK) {
628+
if (retval == JIM_ERR) {
629+
rc = -2;
630+
}
631+
break;
632+
}
633+
}
617634
}
618635
if (oldValue)
619636
Jim_DecrRefCount(interp, oldValue);
@@ -785,7 +802,7 @@ int Jim_eventloopInit(Jim_Interp *interp)
785802

786803
Jim_SetAssocData(interp, "eventloop", JimELAssocDataDeleProc, eventLoop);
787804

788-
Jim_RegisterCmd(interp, "vwait", "?-signal? name", 1, 2, JimELVwaitCommand, NULL, eventLoop, 0);
805+
Jim_RegisterCmd(interp, "vwait", "?-signal? name ?script?", 1, 3, JimELVwaitCommand, NULL, eventLoop, 0);
789806
Jim_RegisterCmd(interp, "update", "?idletasks?", 0, 1, JimELUpdateCommand, NULL, eventLoop, 0);
790807
Jim_RegisterCmd(interp, "after", "option ?arg ...?", 1, -1, JimELAfterCommand, NULL, eventLoop, 0);
791808

0 commit comments

Comments
 (0)