Reputation: 102096
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 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.)
Upvotes: 39
Views: 2682
Reputation: 2466
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.
Upvotes: 8
Reputation: 276
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
Upvotes: 0