]> gitweb.factorcode.org Git - factor.git/blob - vm/tenured_space.hpp
Merge branch 'master' of git://github.com/killy971/factor
[factor.git] / vm / tenured_space.hpp
1 namespace factor
2 {
3
4 struct tenured_space : free_list_allocator<object> {
5         object_start_map starts;
6         std::vector<object *> mark_stack;
7
8         explicit tenured_space(cell size, cell start) :
9                 free_list_allocator<object>(size,start), starts(size,start) {}
10
11         object *allot(cell size)
12         {
13                 object *obj = free_list_allocator<object>::allot(size);
14                 if(obj)
15                 {
16                         starts.record_object_start_offset(obj);
17                         return obj;
18                 }
19                 else
20                         return NULL;
21         }
22
23         cell first_object()
24         {
25                 return (cell)next_allocated_block_after(this->first_block());
26         }
27
28         cell next_object_after(cell scan)
29         {
30                 cell size = ((object *)scan)->size();
31                 object *next = (object *)(scan + size);
32                 return (cell)next_allocated_block_after(next);
33         }
34
35         void clear_mark_bits()
36         {
37                 state.clear_mark_bits();
38         }
39
40         void clear_mark_stack()
41         {
42                 mark_stack.clear();
43         }
44
45         bool marked_p(object *obj)
46         {
47                 return this->state.marked_p(obj);
48         }
49
50         void mark_and_push(object *obj)
51         {
52                 this->state.set_marked_p(obj);
53                 this->mark_stack.push_back(obj);
54         }
55
56         void sweep()
57         {
58                 free_list_allocator<object>::sweep();
59                 starts.update_for_sweep(&this->state);
60         }
61 };
62
63 }