VM: visit_roots and visit_contexts where always called in tandem, make a new method visit_all_roots that calls them both
							parent
							
								
									fe2c2d23de
								
							
						
					
					
						commit
						5490c50217
					
				| 
						 | 
					@ -38,9 +38,8 @@ void factor_vm::collect_aging() {
 | 
				
			||||||
    copying_collector<aging_space, aging_policy> collector(this,
 | 
					    copying_collector<aging_space, aging_policy> collector(this,
 | 
				
			||||||
                                                           this->data->aging,
 | 
					                                                           this->data->aging,
 | 
				
			||||||
                                                           aging_policy(this));
 | 
					                                                           aging_policy(this));
 | 
				
			||||||
    collector.data_visitor.visit_roots();
 | 
					 | 
				
			||||||
    collector.data_visitor.visit_contexts();
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    collector.visitor.visit_all_roots();
 | 
				
			||||||
    collector.cheneys_algorithm();
 | 
					    collector.cheneys_algorithm();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    data->reset_nursery();
 | 
					    data->reset_nursery();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -44,10 +44,13 @@ template <typename Iterator, typename Fixup>
 | 
				
			||||||
void factor_vm::iterate_callstack(context* ctx, Iterator& iterator,
 | 
					void factor_vm::iterate_callstack(context* ctx, Iterator& iterator,
 | 
				
			||||||
                                  Fixup& fixup) {
 | 
					                                  Fixup& fixup) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  FACTOR_ASSERT(!Fixup::translated_code_block_map);
 | 
					 | 
				
			||||||
  cell top = ctx->callstack_top;
 | 
					  cell top = ctx->callstack_top;
 | 
				
			||||||
 | 
					  cell bottom = ctx->callstack_bottom;
 | 
				
			||||||
 | 
					  /* When we are translating the code block maps, all callstacks must
 | 
				
			||||||
 | 
					     be empty. */
 | 
				
			||||||
 | 
					  FACTOR_ASSERT(!Fixup::translated_code_block_map || top == bottom);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  while (top < ctx->callstack_bottom) {
 | 
					  while (top < bottom) {
 | 
				
			||||||
    cell addr = *(cell*)top;
 | 
					    cell addr = *(cell*)top;
 | 
				
			||||||
    FACTOR_ASSERT(addr != 0);
 | 
					    FACTOR_ASSERT(addr != 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -65,7 +68,7 @@ void factor_vm::iterate_callstack(context* ctx, Iterator& iterator,
 | 
				
			||||||
    iterator(top, size, owner, addr);
 | 
					    iterator(top, size, owner, addr);
 | 
				
			||||||
    top += size;
 | 
					    top += size;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  FACTOR_ASSERT(top == ctx->callstack_bottom);
 | 
					  FACTOR_ASSERT(top == bottom);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Allocates memory */
 | 
					/* Allocates memory */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -211,8 +211,7 @@ void factor_vm::collect_compact_impl() {
 | 
				
			||||||
      code->allocator->compact(code_block_updater, fixup, &code_finger);
 | 
					      code->allocator->compact(code_block_updater, fixup, &code_finger);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    forwarder.visit_roots();
 | 
					    forwarder.visit_all_roots();
 | 
				
			||||||
    forwarder.visit_contexts();
 | 
					 | 
				
			||||||
    forwarder.visit_context_code_blocks();
 | 
					    forwarder.visit_context_code_blocks();
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -32,8 +32,7 @@ void factor_vm::collect_mark_impl() {
 | 
				
			||||||
  code->allocator->state.clear_mark_bits();
 | 
					  code->allocator->state.clear_mark_bits();
 | 
				
			||||||
  data->tenured->state.clear_mark_bits();
 | 
					  data->tenured->state.clear_mark_bits();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  visitor.visit_roots();
 | 
					  visitor.visit_all_roots();
 | 
				
			||||||
  visitor.visit_contexts();
 | 
					 | 
				
			||||||
  visitor.visit_context_code_blocks();
 | 
					  visitor.visit_context_code_blocks();
 | 
				
			||||||
  visitor.visit_uninitialized_code_blocks();
 | 
					  visitor.visit_uninitialized_code_blocks();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -117,8 +117,8 @@ struct start_object_updater {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void factor_vm::fixup_data(cell data_offset, cell code_offset) {
 | 
					void factor_vm::fixup_data(cell data_offset, cell code_offset) {
 | 
				
			||||||
  startup_fixup fixup(data_offset, code_offset);
 | 
					  startup_fixup fixup(data_offset, code_offset);
 | 
				
			||||||
  slot_visitor<startup_fixup> data_workhorse(this, fixup);
 | 
					  slot_visitor<startup_fixup> visitor(this, fixup);
 | 
				
			||||||
  data_workhorse.visit_roots();
 | 
					  visitor.visit_all_roots();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  start_object_updater updater(this, fixup);
 | 
					  start_object_updater updater(this, fixup);
 | 
				
			||||||
  data->tenured->iterate(updater, fixup);
 | 
					  data->tenured->iterate(updater, fixup);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -9,9 +9,7 @@ void factor_vm::collect_nursery() {
 | 
				
			||||||
                                                           this->data->aging,
 | 
					                                                           this->data->aging,
 | 
				
			||||||
                                                           nursery_policy(this));
 | 
					                                                           nursery_policy(this));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  collector.data_visitor.visit_roots();
 | 
					  collector.visitor.visit_all_roots();
 | 
				
			||||||
  collector.data_visitor.visit_contexts();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  gc_event* event = current_gc->event;
 | 
					  gc_event* event = current_gc->event;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (event)
 | 
					  if (event)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -146,8 +146,7 @@ void factor_vm::primitive_become() {
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    slot_visitor<slot_become_fixup> workhorse(this,
 | 
					    slot_visitor<slot_become_fixup> workhorse(this,
 | 
				
			||||||
                                              slot_become_fixup(&become_map));
 | 
					                                              slot_become_fixup(&become_map));
 | 
				
			||||||
    workhorse.visit_roots();
 | 
					    workhorse.visit_all_roots();
 | 
				
			||||||
    workhorse.visit_contexts();
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    object_become_visitor object_visitor(&workhorse);
 | 
					    object_become_visitor object_visitor(&workhorse);
 | 
				
			||||||
    each_object(object_visitor);
 | 
					    each_object(object_visitor);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -101,9 +101,8 @@ them.
 | 
				
			||||||
This is used by GC's copying, sweep and compact phases, and the implementation
 | 
					This is used by GC's copying, sweep and compact phases, and the implementation
 | 
				
			||||||
of the become primitive.
 | 
					of the become primitive.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Iteration is driven by visit_*() methods. Some of them define GC roots:
 | 
					Iteration is driven by visit_*() methods. Only one of them define GC roots:
 | 
				
			||||||
- visit_roots()
 | 
					- visit_all_roots()
 | 
				
			||||||
- visit_contexts()
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
Code block visitors iterate over sets of code blocks, applying a functor to
 | 
					Code block visitors iterate over sets of code blocks, applying a functor to
 | 
				
			||||||
each one. The functor returns a new code_block pointer, which may or may not
 | 
					each one. The functor returns a new code_block pointer, which may or may not
 | 
				
			||||||
| 
						 | 
					@ -132,7 +131,7 @@ template <typename Fixup> struct slot_visitor {
 | 
				
			||||||
  void visit_data_roots();
 | 
					  void visit_data_roots();
 | 
				
			||||||
  void visit_callback_roots();
 | 
					  void visit_callback_roots();
 | 
				
			||||||
  void visit_literal_table_roots();
 | 
					  void visit_literal_table_roots();
 | 
				
			||||||
  void visit_roots();
 | 
					  void visit_all_roots();
 | 
				
			||||||
  void visit_callstack_object(callstack* stack);
 | 
					  void visit_callstack_object(callstack* stack);
 | 
				
			||||||
  void visit_callstack(context* ctx);
 | 
					  void visit_callstack(context* ctx);
 | 
				
			||||||
  void visit_context(context *ctx);
 | 
					  void visit_context(context *ctx);
 | 
				
			||||||
| 
						 | 
					@ -242,7 +241,7 @@ template <typename Fixup> void slot_visitor<Fixup>::visit_sample_threads() {
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template <typename Fixup> void slot_visitor<Fixup>::visit_roots() {
 | 
					template <typename Fixup> void slot_visitor<Fixup>::visit_all_roots() {
 | 
				
			||||||
  visit_handle(&parent->true_object);
 | 
					  visit_handle(&parent->true_object);
 | 
				
			||||||
  visit_handle(&parent->bignum_zero);
 | 
					  visit_handle(&parent->bignum_zero);
 | 
				
			||||||
  visit_handle(&parent->bignum_pos_one);
 | 
					  visit_handle(&parent->bignum_pos_one);
 | 
				
			||||||
| 
						 | 
					@ -256,6 +255,9 @@ template <typename Fixup> void slot_visitor<Fixup>::visit_roots() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  visit_object_array(parent->special_objects,
 | 
					  visit_object_array(parent->special_objects,
 | 
				
			||||||
                     parent->special_objects + special_object_count);
 | 
					                     parent->special_objects + special_object_count);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  visit_contexts();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* primitive_minor_gc() is invoked by inline GC checks, and it needs to fill in
 | 
					/* primitive_minor_gc() is invoked by inline GC checks, and it needs to fill in
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -22,9 +22,7 @@ void factor_vm::collect_to_tenured() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  mark_stack.clear();
 | 
					  mark_stack.clear();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  collector.data_visitor.visit_roots();
 | 
					  collector.visitor.visit_all_roots();
 | 
				
			||||||
  collector.data_visitor.visit_contexts();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  gc_event* event = current_gc->event;
 | 
					  gc_event* event = current_gc->event;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (event)
 | 
					  if (event)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue