Now we can interrupt-thread a thread that's GCing, and it
won't ignore us. It will defer the interrupt until the GC is
done, of course.
Those changes in detail:
(1) when deferring a GC from alloc(), we must remember that
there is no signal handler context available, so signal mask
should be taken from (and fiddled in) the normal process
(2) Don't put SIG_STOP_FOR_GC in the blockable set, or we can't
GC threads that are waiting on queues
(3) Remove #if 0 from around the copying of sigmask in
undo_fake_foreign_function_call. Replace sizeof(sigmask_t)
with an expression involving the value of NSIG and the rash
assumption that sigset_t is a bitmask.
(4) Commentary to indicate what's going on, and a couple of
new tests which represent cases that yesterday's code couldn't