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:
- thread-safe, so I can allocate and collect from multiple threads
- 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
- 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.)
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