vm: fix 'become' when aging space is empty
parent
00ce8b6a33
commit
b011295300
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
|
Loading…
Reference in New Issue