[Ecls-list] Making an external signal handler play nice with embedded ECL
Nils Bruin
nbruin at cecm.sfu.ca
Tue Feb 22 23:05:23 UTC 2011
The ECL documentation contains some information about how to set up signal
handling with embedded ECL, but from what I understand the options are
1. Disable signals while ECL code is running
2. Let ECL install its signal handlers (which, in multithreaded mode,
means that ECL will run a thread that will eat and process all signals)
The specific situation I am looking into is integrating ECL into sage, so
basically python. Option 2 seems not feasible, because Python wants to be
able to handle its own signals. Plus, I expect that ECL can't possibly
handle signals properly when execution is not within ECL (we will only
be calling into ECL routines occasionally).
Option 1 seems undesirable, because the intended program to run, maxima,
can sometimes take very long and it would be nice if the user can still
interrupt the computation with CTRL-C when maxima is running.
Currently, we have the option
3. Enable the standard signal handler that is unaware of ECLs
requirements and just longjmps out of ECL when a signal occurs.
This *seems* to work quite well, but I cannot believe this is actually
safe to do. In fact, if someone knows of LISP operations that react
particularly badly to being interrupted so rudely, I would be interested
in testing the present code with it to see how badly things go wrong.
I imagine the *proper* solution is option
4. Make Sage's signal handler aware of ECL's requirements and have a flag
that records whether ECL code is currently executing. If so, handle the
signal in a way that works well with ECL.
Perhaps there is a flag that can be set "a signal has occurred", on which
ECL would simply act as soon as it is safe and raise the appropriate
Condition. This would then propagate to the appropriate condition handler
and (provided no other handlers are installed) come out at the point where
ECL was called, where we can raise the appropriate Python exception in
response.
So my question is: Where do I start in the ECL API to find the right hook
to connect to in the signal handler? For background: Currently we are just
running ECL in a single thread, since Maxima was not really designed for
multi-threaded use anyway.
Additionally, if someone thinks other options than the ones above are more
appropriate I would be interested in hearing about them as well.
Kind regards,
Nils Bruin
More information about the ecl-devel
mailing list