0.9.3.41: gc trigger
* implementation changes
The *NEED-TO-COLLECT-GARBAGE* special is gone. A similar - but
per-thread - special: *GC-PENDING* is here. It is set by both gencgc
and cheneygc trigger.
In threaded builds SIG_STOP_FOR_GC is no longer deferrable by the
normal deferral mechanism and rules. It is only deferred in pseudo
atomic sections and when *GC-INHIBIT*. There is another
per-thread special for this purpose: *STOP-FOR-GC-PENDING*.
Whenever *GC-INHI-BIT* is cleared (either by a GC-ON or when exiting
a WITHOUT-GCING) the pending gc or the signal handler is run:
(when (and (not *gc-inhibit*)
(or #!+sb-thread *stop-for-gc-pending*
*gc-pending*))
(sb!unix::receive-pending-interrupt))
On the receiving side interrupt_handle_pending is made clever enough
not to run pending handlers whose time has not come (i.e. in a
WITHOUT-INTERRUPTS it only does gc and leaves the pending handlers
alone).
* the bugs fixed
** WITHOUT-INTERRUPTS no longer blocks gc from the current or other
threads.
** WITHOUT-GCING on the other hand correctly defers gc, be it
automatically triggered or explicitly called, and SIG_STOP_FOR_GC.
** GC-{ON,OFF} now work within WITHOUT-GCING, too
** the gc trigger is more reliable as it does not share the
interrupt deferral mechanism, most notably sb-sprof does not make
triggering gc any harder
23 files changed: