Esempio n. 1
0
void factor_vm::clear_cards(old_space *gen)
{
    /* NOTE: reverse order due to heap layout. */
    card *first_card = addr_to_card(gen->start);
    card *last_card = addr_to_card(gen->end);
    memset(first_card,0,last_card - first_card);
}
Esempio n. 2
0
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);
}
Esempio n. 3
0
	void trace_cards(SourceGeneration *gen, card mask, Unmarker unmarker)
	{
		card_deck *decks = data->decks;
		card_deck *cards = data->cards;

		cell gen_start_card = addr_to_card(gen->start - data->start);

		cell first_deck = card_deck_for_address(gen->start);
		cell last_deck = card_deck_for_address(gen->end);

		cell start = 0, binary_start = 0, end = 0;

		for(cell deck_index = first_deck; deck_index < last_deck; deck_index++)
		{
			if(decks[deck_index] & mask)
			{
				decks_scanned++;

				cell first_card = first_card_in_deck(deck_index);
				cell last_card = last_card_in_deck(deck_index);

				for(cell card_index = first_card; card_index < last_card; card_index++)
				{
					if(cards[card_index] & mask)
					{
						cards_scanned++;

						if(end < card_start_address(card_index))
						{
							start = gen->starts.find_object_containing_card(card_index - gen_start_card);
							binary_start = start + ((object *)start)->binary_payload_start();
							end = start + ((object *)start)->size();
						}

scan_next_object:				if(start < card_end_address(card_index))
						{
							trace_partial_objects(
								start,
								binary_start,
								card_start_address(card_index),
								card_end_address(card_index));
							if(end < card_end_address(card_index))
							{
								start = gen->next_object_after(start);
								if(start)
								{
									binary_start = start + ((object *)start)->binary_payload_start();
									end = start + ((object *)start)->size();
									goto scan_next_object;
								}
							}
						}

						unmarker(&cards[card_index]);

						if(!start) return;
					}
				}

				unmarker(&decks[deck_index]);
			}
		}
	}
Esempio n. 4
0
void object_start_map::clear_object_start_offsets() {
  memset(object_start_offsets, card_starts_inside_object, addr_to_card(size));
}
Esempio n. 5
0
// we need to remember the first object allocated in the card
void object_start_map::record_object_start_offset(object* obj) {
  cell idx = addr_to_card((cell)obj - start);
  card obj_start = ((cell)obj & addr_card_mask);
  object_start_offsets[idx] = std::min(object_start_offsets[idx], obj_start);
}
Esempio n. 6
0
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);
}
Esempio n. 7
0
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);
}