vm: initialize all_blocks map from image
um, code blocks from the image need to go in the set toodb4
							parent
							
								
									2705fc67cb
								
							
						
					
					
						commit
						81911b9f87
					
				| 
						 | 
					@ -84,19 +84,34 @@ code_block *code_heap::code_block_for_address(cell address)
 | 
				
			||||||
	return found_block;
 | 
						return found_block;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void code_heap::update_all_blocks_map(mark_bits<code_block> *code_forwarding_map)
 | 
					struct all_blocks_set_inserter {
 | 
				
			||||||
 | 
						code_heap *code;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						all_blocks_set_inserter(code_heap *code) : code(code) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void operator()(code_block *block, cell size)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							code->all_blocks.insert(block);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void code_heap::initialize_all_blocks_set()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						all_blocks.clear();
 | 
				
			||||||
 | 
						all_blocks_set_inserter inserter(this);
 | 
				
			||||||
 | 
						allocator->iterate(inserter);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void code_heap::update_all_blocks_set(mark_bits<code_block> *code_forwarding_map)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	std::cout << "updating block map" << std::endl;
 | 
					 | 
				
			||||||
	std::set<code_block *> new_all_blocks;
 | 
						std::set<code_block *> new_all_blocks;
 | 
				
			||||||
	for (std::set<code_block *>::const_iterator oldi = all_blocks.begin();
 | 
						for (std::set<code_block *>::const_iterator oldi = all_blocks.begin();
 | 
				
			||||||
		oldi != all_blocks.end();
 | 
							oldi != all_blocks.end();
 | 
				
			||||||
		++oldi)
 | 
							++oldi)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		code_block *new_block = code_forwarding_map->forward_block(*oldi);
 | 
							code_block *new_block = code_forwarding_map->forward_block(*oldi);
 | 
				
			||||||
		std::cout << "compact " << (void*)*oldi << " -> " << (void*)new_block << std::endl;
 | 
					 | 
				
			||||||
		new_all_blocks.insert(new_block);
 | 
							new_all_blocks.insert(new_block);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	std::cout << "updated" << std::endl;
 | 
					 | 
				
			||||||
	all_blocks.swap(new_all_blocks);
 | 
						all_blocks.swap(new_all_blocks);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -47,7 +47,8 @@ struct code_heap {
 | 
				
			||||||
	void flush_icache();
 | 
						void flush_icache();
 | 
				
			||||||
	void guard_safepoint();
 | 
						void guard_safepoint();
 | 
				
			||||||
	void unguard_safepoint();
 | 
						void unguard_safepoint();
 | 
				
			||||||
	void update_all_blocks_map(mark_bits<code_block> *code_forwarding_map);
 | 
						void initialize_all_blocks_set();
 | 
				
			||||||
 | 
						void update_all_blocks_set(mark_bits<code_block> *code_forwarding_map);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	code_block *code_block_for_address(cell address);
 | 
						code_block *code_block_for_address(cell address);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -186,7 +186,7 @@ void factor_vm::update_code_roots_for_compaction()
 | 
				
			||||||
			root->valid = false;
 | 
								root->valid = false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	code->update_all_blocks_map(state);
 | 
						code->update_all_blocks_set(state);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Compact data and code heaps */
 | 
					/* Compact data and code heaps */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -53,6 +53,7 @@ void factor_vm::load_code_heap(FILE *file, image_header *h, vm_parameters *p)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	code->allocator->initial_free_list(h->code_size);
 | 
						code->allocator->initial_free_list(h->code_size);
 | 
				
			||||||
 | 
						code->initialize_all_blocks_set();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct startup_fixup {
 | 
					struct startup_fixup {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue