On Sun, Mar 14, 2010 at 9:21 PM, Brian Granger <ellisonbg....@gmail.com> wrote:
> Gonzalo,
> Thanks for starting this discussion.  I am willing to help with this effort
> as I definitely need this capability.  Part of the challenge will be
> figuring out how to do this on Windows.

Not necessarily. I think signals(2) is part of C89, and setjmp(3) /
longjmp(3) are as well, so they should work on windows (although it's
probably good for trapping ctrl-c and fp exceptions and not much more
-- but what else do you need?). Note that sigsetjmp(3) / siglongmp(3)
don't seem to be part of ansi c, though... I'm not sure atm why we use
that --- possibly only makes sense on unix and those can be changed to
the no-sig counterparts on windows)

> In terms of syntax, I am not sure that the decorator approach would work.
>  The reason the that you probably don't want to enable this for entire
> functions.  Because it is such an invasive things, you want it on as little
> as possible.  Thus, I almost think the with syntax would work better:
> with c_signals:
>     ....

I wouldn't call this "invasive". Rather, it's "expensive" to set up
(because of the setjmp). Thus, if a codepath uses this, it's better if
it get's called only once, rather than having several (unnested) pairs
during the execution. In fact, the key about supporting nesting is
that we only setjmp at the outer level. So, for instance, if you have
a function f which loops over a function g, and you know g traps the
signals, then you may be better off (performancewise) to trap signals
in f itself, so g doesn't have to repeatedly call setjmp.

IOW, the hard part of trapping the signals is not trapping them, but
recovering. Python recovers using the exception handling mechanism,
but for C code that won't work, which is the reason python can't do
anything with the signals when it's running c code.

To recover, you need to call setjmp() beforehand, at a place where you
know how to recover so you can use longjmp() to actually recover to a
sane state. [setjmp saves the stack context, so longjmp restores, this
is effectively the same as unwinding the stack, except you don't need
support from the intermediate functions as you do in python or c++
exceptions]

> Thoughts?
> Cheers,
> Brian

Best,
Gonzalo

PS: I'll still try to look at the code and write something more
detailed about it. I feel that would help to decide on what's the sane
syntax/name, since there is a bit of confusion on what _sig_on /
_sig_off actually do.

PPS: this seems to be very "ingrained" with the sage inners for
library interfaces, and it's already in there, so it's hard to make a
list of reasons we want to use (e.g. issues we would have otherwise,
features we want it to support, etc). Since you are coming from a
different camp, maybe you can try to list your reasons -- what
problems do you think this would fix for you, and what enhancements
would this bring up. [ok, I know some reasons for sage, but I'm not
listing any to avoid biasing you... ]

-- 
To post to this group, send an email to sage-devel@googlegroups.com
To unsubscribe from this group, send an email to 
sage-devel+unsubscr...@googlegroups.com
For more options, visit this group at http://groups.google.com/group/sage-devel
URL: http://www.sagemath.org

Reply via email to