aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2016-09-09 17:31:16 +1000
committerSteve Bennett <steveb@workware.net.au>2016-09-09 17:37:14 +1000
commit4baa884e739b59dfd50cbf606786c41de1d289a8 (patch)
tree575d5fa4f7e4be4a097f1b98613a87890ef3ae5e
parentcf4ac87da5bba7e95dda8df09ef8ae63d1a2c5ee (diff)
downloadjimtcl-4baa884e739b59dfd50cbf606786c41de1d289a8.zip
jimtcl-4baa884e739b59dfd50cbf606786c41de1d289a8.tar.gz
jimtcl-4baa884e739b59dfd50cbf606786c41de1d289a8.tar.bz2
signal: Remove the signal command from child interpreters
Currently signals can only be delivered to a single interpreter. To avoid confusion where currently this is the most recently created interpreter, don't create the signal command and handle signals in child interpreters. Signed-off-by: Steve Bennett <steveb@workware.net.au>
-rw-r--r--jim-signal.c20
-rw-r--r--jim_tcl.txt3
-rw-r--r--tests/runall.tcl42
3 files changed, 40 insertions, 25 deletions
diff --git a/jim-signal.c b/jim-signal.c
index b760ede..6785240 100644
--- a/jim-signal.c
+++ b/jim-signal.c
@@ -510,19 +510,23 @@ int Jim_signalInit(Jim_Interp *interp)
if (Jim_PackageProvide(interp, "signal", "1.0", JIM_ERRMSG))
return JIM_ERR;
- signal_init_names();
+ Jim_CreateCommand(interp, "alarm", Jim_AlarmCmd, 0, 0);
+ Jim_CreateCommand(interp, "kill", Jim_KillCmd, 0, 0);
+ /* Sleep is slightly dubious here */
+ Jim_CreateCommand(interp, "sleep", Jim_SleepCmd, 0, 0);
/* Teach the jim core how to set a result from a sigmask */
interp->signal_set_result = signal_set_sigmask_result;
- /* Make sure we know where to store the signals which occur */
- sigloc = &interp->sigmask;
+ /* Currently only the top level interp supports signals */
+ if (!sigloc) {
+ signal_init_names();
- Jim_CreateCommand(interp, "signal", Jim_SubCmdProc, (void *)signal_command_table, NULL);
- Jim_CreateCommand(interp, "alarm", Jim_AlarmCmd, 0, 0);
- Jim_CreateCommand(interp, "kill", Jim_KillCmd, 0, 0);
+ /* Make sure we know where to store the signals which occur */
+ sigloc = &interp->sigmask;
+
+ Jim_CreateCommand(interp, "signal", Jim_SubCmdProc, (void *)signal_command_table, NULL);
+ }
- /* Sleep is slightly dubious here */
- Jim_CreateCommand(interp, "sleep", Jim_SleepCmd, 0, 0);
return JIM_OK;
}
diff --git a/jim_tcl.txt b/jim_tcl.txt
index 7d8cd64..7db37a9 100644
--- a/jim_tcl.txt
+++ b/jim_tcl.txt
@@ -3782,6 +3782,9 @@ Handle SIGHUP to reconfigure:
# Received SIGHUP, so reconfigure
}
+Note: signal handling is currently not supported in child interpreters.
+In these interpreters, the signal command does not exist.
+
sleep
~~~~~
+*sleep* 'seconds'+
diff --git a/tests/runall.tcl b/tests/runall.tcl
index 5b5d220..e51d520 100644
--- a/tests/runall.tcl
+++ b/tests/runall.tcl
@@ -24,25 +24,33 @@ if {[info commands interp] eq ""} {
foreach script [lsort [glob *.test]] {
set ::argv0 $script
- set i [interp]
-
- foreach var {argv0 auto_path} {
- $i eval [list set $var [set ::$var]]
- }
-
- # Run the test
- catch -exit {$i eval source $script} msg opts
- if {[info returncode $opts(-code)] eq "error"} {
- puts [format "%16s: --- error ($msg)" $script]
- incr total(fail)
- }
-
- # Extract the counts
- foreach var {pass fail skip tests} {
- incr total($var) [$i eval "set testinfo(num$var)"]
+ if {$script eq "signal.test"} {
+ # special case, can't run this in a child interpeter
+ source $script
+ foreach var {pass fail skip tests} {
+ incr total($var) $testinfo(num$var)
+ }
+ } else {
+ set i [interp]
+
+ foreach var {argv0 auto_path} {
+ $i eval [list set $var [set ::$var]]
+ }
+
+ # Run the test
+ catch -exit {$i eval source $script} msg opts
+ if {[info returncode $opts(-code)] eq "error"} {
+ puts [format "%16s: --- error ($msg)" $script]
+ incr total(fail)
+ }
+
+ # Extract the counts
+ foreach var {pass fail skip tests} {
+ incr total($var) [$i eval "set testinfo(num$var)"]
+ }
+ $i delete
}
- $i delete
stdout flush
}
puts [string repeat = 73]