8 个版本
0.3.0 | 2019年9月28日 |
---|---|
0.2.5 | 2019年9月26日 |
0.1.0 | 2019年9月25日 |
在 #gc 中排名 53
50KB
1.5K SLoC
PGC
基于 Rust 的精确跟踪垃圾收集器,具有并行标记和标记-清除算法。
如何使用
要将 PGC 包含到您的项目中,请将以下内容添加到您的 Cargo.toml 文件中
[dependencies]
pgc = "*"
这可以像 Rc 一样使用,除了内部可变性。
放置在 Gc
和 Rooted
中的类型必须实现 GcObject
和 Send
。
use pgc::*;
struct Foo {
x: Gc<i32>,
y: i32
}
unsafe impl GcObject for Foo {
fn references(&self) -> Vec<Gc<dyn GcObject>> {
let mut v: Vec<Gc<dyn GcObject>> = vec![];
v.push(self.x);
v
}
}
要使用 Gc
,只需调用 Gc::new
let foo = Gc::new(Foo {...});
GC 不会扫描程序栈以查找根对象,因此您需要显式添加根。
let foo = Gc::new(Foo {...});
add_root(foo);
... // do something with `foo`
remove_root(foo);
// Or use `Rooted` struct that will unroot object automatically:
let foo = Rooted:new(Foo {...});
问题
当前的收集算法不是完全线程安全的,对于在多个线程中收集对象,我们应该提供一些平台相关的代码以暂停线程(停止世界)停止世界机制似乎工作正常。- 不是完全增量。标记可以并行进行,但如果你想要标记小块内存,你应该在代码中调用
gc_mark
。 - 由于 Rust 动态分派不完全允许将某些随机指针转换为 trait 对象,因此 GC 不能正确地扫描程序栈中的对象,因此您应该显式地根化和去根对象。
依赖项
~3.5MB
~59K SLoC