Running Boehm GC in multiple threads independently

2.5k views Asked by At

I'm experimenting with writing some bindings to the Boehm GC for Rust.

Some background: Rust is designed to be a high-concurrent language, and a result of this design is having the ability to statically restrict GC pointers to within the threads in which they were allocated (that is, a GC pointer allocated in thread x can never be kept alive (or even referenced at all) by another thread).

Hence, I wish to drive Boehm to capitalise on this for performance as much as possible:

  1. thread-safe, so I can allocate and collect from multiple threads
  2. stop-as-little-as-possible collections (i.e. just the current thread), other threads can keep running because they can't possibly interfere with anything relevant to the GC pointers outside of themselves
  3. preferably, entirely thread-locally with no synchronisation between the GC "instances" of different threads

1 is easy, but I can't find any facility for 2 and 3. The most important part is 1 & 2 because I want to be able to have threads running in the background, independently of what the other threads are doing (even if they are all allocating and garbage-collecting gigabytes of memory).

(I do know about THREAD_LOCAL_ALLOC & gc_thread_local.h, but that doesn't quite satisfy 3 fully, it just makes it more efficient, but it is still valid to transfer the pointers allocated thread-locally between threads, while I don't need that guarantee.)

2

There are 2 answers

0
Ivan Maidanski On

Facility 3 seems to be implemented in a Boehm GC fork by declaring each global variable of the collector as thread-local one - https://github.com/Samsung/gcutil/commit/0cc277fb0cef82d515cc4ff4a439e50568474e16

0
David Jeske On

I don't have an answer about how to do this with Boehm. However, here are two GCs which seem to have enough control and encapsulation to have a totally independent GC context per-thread.