]> gitweb.factorcode.org Git - factor.git/blob - vm/data_heap.hpp
vm: move factor_vm::untagged_object_size() to object::size()
[factor.git] / vm / data_heap.hpp
1 namespace factor
2 {
3
4 struct data_heap {
5         cell start;
6
7         cell young_size;
8         cell aging_size;
9         cell tenured_size;
10
11         segment *seg;
12
13         zone *nursery;
14         aging_space *aging;
15         aging_space *aging_semispace;
16         tenured_space *tenured;
17         tenured_space *tenured_semispace;
18
19         card *cards;
20         card *cards_end;
21
22         card_deck *decks;
23         card_deck *decks_end;
24         
25         explicit data_heap(cell young_size, cell aging_size, cell tenured_size);
26         ~data_heap();
27         data_heap *grow(cell requested_size);
28         template<typename Generation> void clear_cards(Generation *gen);
29         template<typename Generation> void clear_decks(Generation *gen);
30         template<typename Generation> void reset_generation(Generation *gen);
31 };
32
33 template<typename Generation> void data_heap::clear_cards(Generation *gen)
34 {
35         cell first_card = addr_to_card(gen->start - start);
36         cell last_card = addr_to_card(gen->end - start);
37         memset(&cards[first_card],0,last_card - first_card);
38 }
39
40 template<typename Generation> void data_heap::clear_decks(Generation *gen)
41 {
42         cell first_deck = addr_to_deck(gen->start - start);
43         cell last_deck = addr_to_deck(gen->end - start);
44         memset(&decks[first_deck],0,last_deck - first_deck);
45 }
46
47 /* After garbage collection, any generations which are now empty need to have
48 their allocation pointers and cards reset. */
49 template<typename Generation> void data_heap::reset_generation(Generation *gen)
50 {
51         gen->here = gen->start;
52
53         clear_cards(gen);
54         clear_decks(gen);
55         gen->clear_object_start_offsets();
56 }
57
58 }