]> gitweb.factorcode.org Git - factor.git/blob - vm/full_collector.cpp
vm: 4 bit tags, new representation of alien objects makes unbox-any-c-ptr more effici...
[factor.git] / vm / full_collector.cpp
1 #include "master.hpp"
2
3 namespace factor
4 {
5
6 full_collector::full_collector(factor_vm *parent_) :
7         collector<tenured_space,full_policy>(
8                 parent_,
9                 parent_->data->tenured,
10                 full_policy(parent_)) {}
11
12 struct code_block_marker {
13         code_heap *code;
14         full_collector *collector;
15
16         explicit code_block_marker(code_heap *code_, full_collector *collector_) :
17                 code(code_), collector(collector_) {}
18
19         code_block *operator()(code_block *compiled)
20         {
21                 if(!code->marked_p(compiled))
22                 {
23                         code->set_marked_p(compiled);
24                         collector->trace_literal_references(compiled);
25                 }
26
27                 return compiled;
28         }
29 };
30
31 void factor_vm::collect_mark_impl(bool trace_contexts_p)
32 {
33         full_collector collector(this);
34
35         code->clear_mark_bits();
36         data->tenured->clear_mark_bits();
37         data->tenured->clear_mark_stack();
38
39         code_block_visitor<code_block_marker> code_marker(this,code_block_marker(code,&collector));
40
41         collector.trace_roots();
42         if(trace_contexts_p)
43         {
44                 collector.trace_contexts();
45                 code_marker.visit_context_code_blocks();
46                 code_marker.visit_callback_code_blocks();
47         }
48
49         std::vector<object *> *mark_stack = &data->tenured->mark_stack;
50
51         while(!mark_stack->empty())
52         {
53                 object *obj = mark_stack->back();
54                 mark_stack->pop_back();
55                 collector.trace_object(obj);
56                 code_marker.visit_object_code_block(obj);
57         }
58
59         data->reset_generation(data->tenured);
60         data->reset_generation(data->aging);
61         data->reset_generation(&nursery);
62         code->clear_remembered_set();
63 }
64
65 void factor_vm::collect_sweep_impl()
66 {
67         current_gc->event->started_data_sweep();
68         data->tenured->sweep();
69         current_gc->event->ended_data_sweep();
70 }
71
72 void factor_vm::collect_growing_heap(cell requested_bytes, bool trace_contexts_p)
73 {
74         /* Grow the data heap and copy all live objects to the new heap. */
75         data_heap *old = data;
76         set_data_heap(data->grow(requested_bytes));
77         collect_mark_impl(trace_contexts_p);
78         collect_compact_code_impl(trace_contexts_p);
79         delete old;
80 }
81
82 }