diff options
author | Steve Bennett <steveb@workware.net.au> | 2013-07-22 10:29:42 +1000 |
---|---|---|
committer | Steve Bennett <steveb@workware.net.au> | 2013-07-22 10:46:20 +1000 |
commit | c8df8ad4f5fed5a9c85498987e9b416e69fb3b44 (patch) | |
tree | b68919687ad14c7496c009b42c3da28586ff4954 /jim.c | |
parent | 5ca6b7ff651246cec3a09a94fda36dc5872fa759 (diff) | |
download | jimtcl-c8df8ad4f5fed5a9c85498987e9b416e69fb3b44.zip jimtcl-c8df8ad4f5fed5a9c85498987e9b416e69fb3b44.tar.gz jimtcl-c8df8ad4f5fed5a9c85498987e9b416e69fb3b44.tar.bz2 |
Ensure that signals can break vwait
The following should break when a handled signal is caught.
catch -signal { vwait forever }
Signed-off-by: Steve Bennett <steveb@workware.net.au>
Diffstat (limited to 'jim.c')
-rw-r--r-- | jim.c | 15 |
1 files changed, 12 insertions, 3 deletions
@@ -10516,8 +10516,8 @@ int Jim_EvalObj(Jim_Interp *interp, Jim_Obj *scriptObjPtr) if (retcode == JIM_OK && argc) { /* Invoke the command */ retcode = JimInvokeCommand(interp, argc, argv); - if (interp->signal_level && interp->sigmask) { - /* Check for a signal after each command */ + /* Check for a signal after each command */ + if (Jim_CheckSignal(interp)) { retcode = JIM_SIGNAL; } } @@ -13679,6 +13679,15 @@ static int Jim_ExitCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *arg return JIM_EXIT; } +/** + * Returns 1 if a signal has been received while + * in a catch -signal {} clause. + */ +int Jim_CheckSignal(Jim_Interp *interp) +{ + return interp->signal_level && interp->sigmask; +} + /* [catch] */ static int Jim_CatchCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { @@ -13750,7 +13759,7 @@ static int Jim_CatchCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *ar } interp->signal_level += sig; - if (interp->signal_level && interp->sigmask) { + if (Jim_CheckSignal(interp)) { /* If a signal is set, don't even try to execute the body */ exitCode = JIM_SIGNAL; } |