-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgc.cpp
65 lines (43 loc) · 907 Bytes
/
gc.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include "gc.hpp"
#include <iostream>
#include <vector>
namespace foo {
struct bar {
gc<bar> derp;
gc<int> data;
~bar() {
std::clog << "bar dtor" << std::endl;
}
};
void gc_mark(bar& self) {
self.derp.mark();
self.data.mark();
}
}
int main(int, char**) {
// gc roots
std::vector<gc_base> roots;
auto collect = [&] {
std::clog << "collect" << std::endl;
for(auto& obj : roots) { obj.mark(); }
object::sweep();
};
using namespace foo;
gc<bar> ptr = make_gc<bar>();
ptr->data = make_gc<int>(1);
ptr->derp = ptr; // cycle here
gc<bar> ptr2 = make_gc<bar>();
ptr2->derp = ptr;
// push roots
roots.push_back(ptr);
roots.push_back(ptr2);
collect();
// pop roots & collect
roots.pop_back();
collect();
roots.pop_back();
collect();
// empty root set
collect();
return 0;
}