I notice under "unfixed bugs" you have a report from David Tweed about
interrupting hugs under Linux.  One of our users independently discovered
this under Solaris 2.5.  Brief summary is: if you type [1..] then you have
to press control-C to interrupt it.  This works the first time, but on
subsequent occasions it won't stop unless you kill the interpreter with
SIGQUIT or another signal.

This boils down to the assertion "handlers can longjmp".  Yes they can,
but with two provisos.  The first is that you shouldn't do this if the
interruption could have happened during a critical section of code which
leaves the program in an inconsistent state.  I assume this is not the case
since interruption clears the state of the interpreter.  The second proviso
is that you need to unblock the signal, because the signal will be blocked
while the signal handler is active and the system may not unblock it if the
signal handler does not return normally.

On Solaris this can be done as follows:

# define ctrlbrk(bh)    (signal(SIGINT,bh),sigrelse(SIGINT))

I don't know how portable the sigrelse function is, but it could be emulated
with calls to sigsetmask and/or sigaction.

A 10-second glance at the source of hugs98 indicates that this might be
a problem in hugs98 too.

imc

Reply via email to