We do all of that in linux-threads. Somebody needs to debug it though
and I don't have the time.
- Godmar
>
> This may not be entirely relevant, or it might.
>
> For any port using native threads, the following must be considered:
>
> 1. When the GC thread does a GC, no other threads may run. This is because
> if the GC thread gets preempted, then another thread may create a
> reference to an object by modifying memory that the GC has already walked.
> If the GC sees no other reference to this memory, then it will be freed,
> even though there is a reference to it.
>
> AmigaOS provides Forbid() and Permit() which nicely block other threads
> (as well as all other threads in the system, ugh).
>
> POSIX threads provides no adequate facility.
>
> 2. The GC thread must also walk the register files of sleeping threads, since
> in a JIT system, the only reference to an object might be in a register.
> This requires that the GC have some knowledge of how registers are stored
> on the native thread system (typically, registers are stored on the stack).
>
> Systems that do thread switching entirely in the kernel, and place the
> registers on the kernel stack, will not work out here, since the user-land
> GC has no way of reading kernel memory.
>
> If these issues are not addressed, then subtle GC bugs may occur.
>
> Note that if you are running your own thread package, tending to these is
> easy, since you can provide the necessary functionality.
>