VM: new function visit_mark_stack() to factor out the mark stack iteration
							parent
							
								
									667e5768ba
								
							
						
					
					
						commit
						b5a206c587
					
				| 
						 | 
				
			
			@ -26,7 +26,7 @@ void factor_vm::collect_aging() {
 | 
			
		|||
    if (event)
 | 
			
		||||
      event->ended_code_scan(collector.code_blocks_scanned);
 | 
			
		||||
 | 
			
		||||
    collector.tenure_reachable_objects();
 | 
			
		||||
    collector.visitor.visit_mark_stack(&mark_stack);
 | 
			
		||||
  }
 | 
			
		||||
  {
 | 
			
		||||
    /* If collection fails here, do a to_tenured collection. */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -36,23 +36,8 @@ void factor_vm::collect_mark_impl() {
 | 
			
		|||
  visitor.visit_context_code_blocks();
 | 
			
		||||
  visitor.visit_uninitialized_code_blocks();
 | 
			
		||||
 | 
			
		||||
  while (!mark_stack.empty()) {
 | 
			
		||||
    cell ptr = mark_stack.back();
 | 
			
		||||
    mark_stack.pop_back();
 | 
			
		||||
  visitor.visit_mark_stack(&mark_stack);
 | 
			
		||||
 | 
			
		||||
    if (ptr & 1) {
 | 
			
		||||
      code_block* compiled = (code_block*)(ptr - 1);
 | 
			
		||||
      visitor.visit_code_block_objects(compiled);
 | 
			
		||||
      visitor.visit_embedded_literals(compiled);
 | 
			
		||||
      visitor.visit_embedded_code_pointers(compiled);
 | 
			
		||||
    } else {
 | 
			
		||||
      object* obj = (object*)ptr;
 | 
			
		||||
      visitor.visit_slots(obj);
 | 
			
		||||
      if (obj->type() == ALIEN_TYPE)
 | 
			
		||||
        ((alien*)obj)->update_address();
 | 
			
		||||
      visitor.visit_object_code_block(obj);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  data->reset_tenured();
 | 
			
		||||
  data->reset_aging();
 | 
			
		||||
  data->reset_nursery();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -144,6 +144,7 @@ template <typename Fixup> struct slot_visitor {
 | 
			
		|||
  void visit_context_code_blocks();
 | 
			
		||||
  void visit_uninitialized_code_blocks();
 | 
			
		||||
  void visit_embedded_code_pointers(code_block* compiled);
 | 
			
		||||
  void visit_mark_stack(std::vector<cell>* mark_stack);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename Fixup>
 | 
			
		||||
| 
						 | 
				
			
			@ -256,7 +257,6 @@ template <typename Fixup> void slot_visitor<Fixup>::visit_all_roots() {
 | 
			
		|||
  visit_object_array(parent->special_objects,
 | 
			
		||||
                     parent->special_objects + special_object_count);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  visit_contexts();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -536,4 +536,29 @@ void slot_visitor<Fixup>::visit_embedded_code_pointers(code_block* compiled) {
 | 
			
		|||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Pops items from the mark stack and visits them until the stack is
 | 
			
		||||
   empty. Used when doing a full collection and when collecting to
 | 
			
		||||
   tenured space. */
 | 
			
		||||
template <typename Fixup>
 | 
			
		||||
void slot_visitor<Fixup>::visit_mark_stack(std::vector<cell>* mark_stack) {
 | 
			
		||||
  while (!mark_stack->empty()) {
 | 
			
		||||
    cell ptr = mark_stack->back();
 | 
			
		||||
    // TJaba
 | 
			
		||||
    mark_stack->pop_back();
 | 
			
		||||
 | 
			
		||||
    if (ptr & 1) {
 | 
			
		||||
      code_block* compiled = (code_block*)(ptr - 1);
 | 
			
		||||
      visit_code_block_objects(compiled);
 | 
			
		||||
      visit_embedded_literals(compiled);
 | 
			
		||||
      visit_embedded_code_pointers(compiled);
 | 
			
		||||
    } else {
 | 
			
		||||
      object* obj = (object*)ptr;
 | 
			
		||||
      visit_slots(obj);
 | 
			
		||||
      if (obj->type() == ALIEN_TYPE)
 | 
			
		||||
        ((alien*)obj)->update_address();
 | 
			
		||||
      visit_object_code_block(obj);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,15 +7,6 @@ to_tenured_collector::to_tenured_collector(factor_vm* parent)
 | 
			
		|||
                                                  parent->data->tenured,
 | 
			
		||||
                                                  to_tenured_policy(parent)) {}
 | 
			
		||||
 | 
			
		||||
void to_tenured_collector::tenure_reachable_objects() {
 | 
			
		||||
  std::vector<cell>* mark_stack = &parent->mark_stack;
 | 
			
		||||
  while (!mark_stack->empty()) {
 | 
			
		||||
    cell ptr = mark_stack->back();
 | 
			
		||||
    mark_stack->pop_back();
 | 
			
		||||
    this->trace_object((object*)ptr);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void factor_vm::collect_to_tenured() {
 | 
			
		||||
  /* Copy live objects from aging space to tenured space. */
 | 
			
		||||
  to_tenured_collector collector(this);
 | 
			
		||||
| 
						 | 
				
			
			@ -37,7 +28,7 @@ void factor_vm::collect_to_tenured() {
 | 
			
		|||
  if (event)
 | 
			
		||||
    event->ended_code_scan(collector.code_blocks_scanned);
 | 
			
		||||
 | 
			
		||||
  collector.tenure_reachable_objects();
 | 
			
		||||
  collector.visitor.visit_mark_stack(&mark_stack);
 | 
			
		||||
 | 
			
		||||
  data->reset_nursery();
 | 
			
		||||
  data->reset_aging();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue