vm: fix 'become' when aging space is empty

db4
Slava Pestov 2009-11-05 23:53:53 -06:00
parent 00ce8b6a33
commit b011295300
3 changed files with 21 additions and 22 deletions

View File

@ -38,13 +38,13 @@ inline cell log2(cell x)
#else #else
cell n = 0; cell n = 0;
#ifdef FACTOR_64 #ifdef FACTOR_64
if (x >= (u64)1 << 32) { x >>= 32; n += 32; } if (x >= (cell)1 << 32) { x >>= 32; n += 32; }
#endif #endif
if (x >= (u32)1 << 16) { x >>= 16; n += 16; } if (x >= (cell)1 << 16) { x >>= 16; n += 16; }
if (x >= (u32)1 << 8) { x >>= 8; n += 8; } if (x >= (cell)1 << 8) { x >>= 8; n += 8; }
if (x >= (u32)1 << 4) { x >>= 4; n += 4; } if (x >= (cell)1 << 4) { x >>= 4; n += 4; }
if (x >= (u32)1 << 2) { x >>= 2; n += 2; } if (x >= (cell)1 << 2) { x >>= 2; n += 2; }
if (x >= (u32)1 << 1) { n += 1; } if (x >= (cell)1 << 1) { n += 1; }
#endif #endif
return n; return n;
} }

View File

@ -196,14 +196,14 @@ template<typename TargetGeneration, typename Policy> struct collector {
{ {
card_deck *decks = data->decks; card_deck *decks = data->decks;
card_deck *cards = data->cards; card_deck *cards = data->cards;
cell gen_start_card = addr_to_card(gen->start - data->start); cell gen_start_card = addr_to_card(gen->start - data->start);
cell first_deck = card_deck_for_address(gen->start); cell first_deck = card_deck_for_address(gen->start);
cell last_deck = card_deck_for_address(gen->end); cell last_deck = card_deck_for_address(gen->end);
cell start = 0, binary_start = 0, end = 0; cell start = 0, binary_start = 0, end = 0;
for(cell deck_index = first_deck; deck_index < last_deck; deck_index++) for(cell deck_index = first_deck; deck_index < last_deck; deck_index++)
{ {
if(decks[deck_index] & mask) if(decks[deck_index] & mask)
@ -212,7 +212,7 @@ template<typename TargetGeneration, typename Policy> struct collector {
cell first_card = first_card_in_deck(deck_index); cell first_card = first_card_in_deck(deck_index);
cell last_card = last_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++) for(cell card_index = first_card; card_index < last_card; card_index++)
{ {
if(cards[card_index] & mask) if(cards[card_index] & mask)
@ -225,13 +225,9 @@ template<typename TargetGeneration, typename Policy> struct collector {
binary_start = start + ((object *)start)->binary_payload_start(); binary_start = start + ((object *)start)->binary_payload_start();
end = start + ((object *)start)->size(); end = start + ((object *)start)->size();
} }
#ifdef FACTOR_DEBUG
assert(addr_to_card(start - data->start) <= card_index);
assert(start < card_end_address(card_index));
#endif
scan_next_object: { scan_next_object: if(start < card_end_address(card_index))
{
trace_partial_objects( trace_partial_objects(
start, start,
binary_start, binary_start,
@ -248,13 +244,13 @@ scan_next_object: {
} }
} }
} }
unmarker(&cards[card_index]); unmarker(&cards[card_index]);
if(!start) return; if(!start) return;
} }
} }
unmarker(&decks[deck_index]); unmarker(&decks[deck_index]);
} }
} }

View File

@ -22,9 +22,12 @@ void factor_vm::collect_nursery()
collector.trace_cards(data->tenured, collector.trace_cards(data->tenured,
card_points_to_nursery, card_points_to_nursery,
simple_unmarker(card_points_to_nursery)); simple_unmarker(card_points_to_nursery));
collector.trace_cards(data->aging, if(data->aging->here != data->aging->start)
card_points_to_nursery, {
full_unmarker()); collector.trace_cards(data->aging,
card_points_to_nursery,
full_unmarker());
}
current_gc->event->ended_card_scan(collector.cards_scanned,collector.decks_scanned); current_gc->event->ended_card_scan(collector.cards_scanned,collector.decks_scanned);
current_gc->event->started_code_scan(); current_gc->event->started_code_scan();