Re: gc & blocked signals

Raymond Toy <[email protected]> Fri, 3 Feb 2012 09:15:06 -0800
Newsgroups gmane.lisp.cmucl.devel
Message-ID <CAG14z1HG4OjCkVUTqNAi4u_kn1oQ9MbTmYXgYE5O_KEcKk-n=A@mail.gmail.com>
On Tue, Jan 31, 2012 at 2:03 PM, Helmut Eller <[email protected]>wrote:

> I think there is a problem related to blocked signals and garbage
> collection:
>
> 1. Start cmucl -noinit -eval '(loop (ext:gc :full t))'
>   in a terminal and let it run.
>
> 2. Under Linux,  cat /proc/<pid>/status  shows that SigBlk is 0 i.e.
>   no signals are blocked.
>
> 3. Interrupt the loop with C-c (SIGINT) and wait for the debugger.
>
> 4. SigBlk is still 0.
>
> 5. Type c to continue the loop.
>
> 6. SigBlk is now 000000001fc90000
>
> That's a bug, right?  It should again be zero.
>
>
For your example with just a simple loop, a C-c causes an interrupt to
happen right away, so things work.  But when GC is running, interrupts are
disabled, so the C-c is remembered and and deferred to a later time and
then handled with a pendingInterrupt trap.  This is the main difference
between the two cases.

I think the problem is in interrupt_handle_pending:

    memcpy(&context->uc_sigmask, &pending_mask, NSIG / LONG_BIT);

We are trying to restore the sigmask that was saved by setup_pending_signal
(that coincidentally copies the entire uc_sigmask to pending_mask).

NSIG = 65 and LONG_BIT = 32 on my machine, so memcpy only copies 2 bytes.
I think we really want to copy at least 64 bits or 8 bytes.  If I modify
this code to copy 8 bytes, SigBlk is now 0 after returning, and C-c
continues to work.

This seems like a very long-standing bug!  Thanks for pointing it out.
This change will get into the Feb snapshot.  I hope you can do some testing
with it and let me know how it works out.

Ray
_______________________________________________
cmucl-imp mailing list
[email protected]
http://lists.zs64.net/mailman/listinfo/cmucl-imp