void factor_vm::clear_decks(old_space *gen) { /* NOTE: reverse order due to heap layout. */ card_deck *first_deck = addr_to_deck(gen->start); card_deck *last_deck = addr_to_deck(gen->end); memset(first_deck,0,last_deck - first_deck); }
data_heap::data_heap(cell young_size_, cell aging_size_, cell tenured_size_) { young_size_ = align(young_size_,deck_size); aging_size_ = align(aging_size_,deck_size); tenured_size_ = align(tenured_size_,deck_size); young_size = young_size_; aging_size = aging_size_; tenured_size = tenured_size_; cell total_size = young_size + 2 * aging_size + tenured_size + deck_size; seg = new segment(total_size,false); cell cards_size = addr_to_card(total_size); cards = new card[cards_size]; cards_end = cards + cards_size; memset(cards,0,cards_size); cell decks_size = addr_to_deck(total_size); decks = new card_deck[decks_size]; decks_end = decks + decks_size; memset(decks,0,decks_size); start = align(seg->start,deck_size); tenured = new tenured_space(tenured_size,start); aging = new aging_space(aging_size,tenured->end); aging_semispace = new aging_space(aging_size,aging->end); nursery = new nursery_space(young_size,aging_semispace->end); FACTOR_ASSERT(seg->end - nursery->end <= deck_size); }
inline cell card_deck_for_address(cell a) { return addr_to_deck(a - data->start); }
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); }
void factor_vm::init_card_decks() { cards_offset = (cell)data->cards - addr_to_card(data->start); decks_offset = (cell)data->decks - addr_to_deck(data->start); }