From: <me...@ho...> - 2005-08-08 09:52:59
|
* triggerring gc As the code uses something like: if(!data->pending_handler) maybe_defer_handler(interrupt_maybe_gc_int,...) triggerring gc is not reliable especially under heavy interrupt load (read:= =20 sb-sprof). Furthermore, in a WITHOUT-INTERRUPTS gc is not triggered, becaus= e=20 maybe_defer_handler defers it. * delivery of SIG_STOP_FOR_GC In a WITHOUT-INTERRUPTS block this signal is deferred, thus the gc cannot=20 start until an exit from it. * WITHOUT-GCING Thread A can already be stopping the world when thread B enters the=20 WITHOUT-GCING body and since the SIG_STOP_FOR_GC is not blocked thread B is= =20 stopped and gc starts. Assuming these are undesirable (including WITHOUT-INTERRUPTS deferring gc (= ?))=20 my current plan is to add gc_pending, sig_stop_for_gc_pending fields to=20 interrupt_data and: =2D make WITHOUT-INTERRUPTS let gcs and SIG_STOP_FOR_GCs through =2D make WITHOUT-GCING and pseudo atomic block/defer SIG_STOP_FOR_GC =2D give priority to gc over signal handling (?!), if there is an interrupt= and=20 a gc/SIG_STOP_FOR_GC pending do the gc first Currently, I'm reading up on the fabulous and rich history of gencgc.c, but= in=20 the meantime let me know if you have a simple(r) scheme for this. Cheers, G=E1bor |