GC and threads
Saaa
empty at needmail.com
Sun Jan 28 12:31:12 PST 2007
Interrupt Service Routines
When the garbage collector does a collection pass, it must pause all running
threads in order to scan their stacks and register contents for references
to GC allocated objects. If an ISR (Interrupt Service Routine) thread is
paused, this can break the program.
Therefore, the ISR thread should not be paused. Threads created with the
std.thread functions will be paused. But threads created with C's
_beginthread() or equivalent won't be, the GC won't know they exist.
For this to work successfully:
a.. The ISR thread cannot allocate any memory using the GC. This means
that the global new cannot be used. Nor can dynamic arrays be resized, nor
can any elements be added to associative arrays. Any use of the D runtime
library should be examined for any possibility of allocating GC memory - or
better yet, the ISR should not call any D runtime library functions at all.
b.. The ISR cannot hold the sole reference to any GC allocated memory,
otherwise the GC may free the memory while the ISR is still using it. The
solution is to have one of the paused threads hold a reference to it too, or
store a reference to it in global data.
More information about the Digitalmars-d
mailing list