factor/vm/data_heap.hpp

59 lines
1.4 KiB
C++
Raw Normal View History

2009-05-04 02:46:13 -04:00
namespace factor
{
2009-05-04 05:50:24 -04:00
struct data_heap {
2009-10-09 12:16:18 -04:00
cell start;
2009-05-04 05:50:24 -04:00
cell young_size;
cell aging_size;
cell tenured_size;
2009-05-02 05:04:19 -04:00
segment *seg;
zone *nursery;
aging_space *aging;
aging_space *aging_semispace;
tenured_space *tenured;
tenured_space *tenured_semispace;
2009-05-02 05:04:19 -04:00
2009-10-09 12:16:18 -04:00
card *cards;
card *cards_end;
2009-05-02 05:04:19 -04:00
2009-10-09 12:16:18 -04:00
card_deck *decks;
card_deck *decks_end;
explicit data_heap(cell young_size, cell aging_size, cell tenured_size);
~data_heap();
data_heap *grow(cell requested_size);
template<typename Generation> void clear_cards(Generation *gen);
template<typename Generation> void clear_decks(Generation *gen);
template<typename Generation> void reset_generation(Generation *gen);
2009-05-02 10:19:09 -04:00
};
2009-05-02 05:04:19 -04:00
template<typename Generation> void data_heap::clear_cards(Generation *gen)
{
cell first_card = addr_to_card(gen->start - start);
cell last_card = addr_to_card(gen->end - start);
memset(&cards[first_card],0,last_card - first_card);
}
template<typename Generation> void data_heap::clear_decks(Generation *gen)
{
cell first_deck = addr_to_deck(gen->start - start);
cell last_deck = addr_to_deck(gen->end - start);
memset(&decks[first_deck],0,last_deck - first_deck);
}
/* After garbage collection, any generations which are now empty need to have
their allocation pointers and cards reset. */
template<typename Generation> void data_heap::reset_generation(Generation *gen)
{
gen->here = gen->start;
clear_cards(gen);
clear_decks(gen);
gen->clear_object_start_offsets();
}
2009-05-04 02:46:13 -04:00
}