VM: undo 7d9bad465c
				
					
				
			It cause the code heap to run out of memory to soon and without growth, it crashed windows.char-rename
							parent
							
								
									4737645857
								
							
						
					
					
						commit
						20a98a38fb
					
				|  | @ -6,20 +6,20 @@ namespace factor { | ||||||
| // Allocates memory
 | // Allocates memory
 | ||||||
| inline code_block* factor_vm::allot_code_block(cell size, | inline code_block* factor_vm::allot_code_block(cell size, | ||||||
|                                                code_block_type type) { |                                                code_block_type type) { | ||||||
| 
 |  | ||||||
|   cell block_size = size + sizeof(code_block); |   cell block_size = size + sizeof(code_block); | ||||||
|   cell required_free = block_size + code->high_water_mark(); |   code_block* block = code->allocator->allot(block_size); | ||||||
|   if (!code->allocator->can_allot_p(required_free)) { |  | ||||||
| 
 | 
 | ||||||
|  |   if (block == NULL) { | ||||||
|     // If allocation failed, do a full GC and compact the code heap.
 |     // If allocation failed, do a full GC and compact the code heap.
 | ||||||
|     // A full GC that occurs as a result of the data heap filling up does not
 |     // A full GC that occurs as a result of the data heap filling up does not
 | ||||||
|     // trigger a compaction. This setup ensures that most GCs do not compact
 |     // trigger a compaction. This setup ensures that most GCs do not compact
 | ||||||
|     // the code heap, but if the code fills up, it probably means it will be
 |     // the code heap, but if the code fills up, it probably means it will be
 | ||||||
|     // fragmented after GC anyway, so its best to compact.
 |     // fragmented after GC anyway, so its best to compact.
 | ||||||
|     primitive_compact_gc(); |     primitive_compact_gc(); | ||||||
|  |     block = code->allocator->allot(block_size); | ||||||
| 
 | 
 | ||||||
|     // Insufficient room even after code GC, give up
 |     // Insufficient room even after code GC, give up
 | ||||||
|     if (!code->allocator->can_allot_p(required_free)) { |     if (block == NULL) { | ||||||
|       std::cout << "Code heap used: " << code->allocator->occupied_space() |       std::cout << "Code heap used: " << code->allocator->occupied_space() | ||||||
|                 << "\n"; |                 << "\n"; | ||||||
|       std::cout << "Code heap free: " << code->allocator->free_space << "\n"; |       std::cout << "Code heap free: " << code->allocator->free_space << "\n"; | ||||||
|  | @ -27,7 +27,6 @@ inline code_block* factor_vm::allot_code_block(cell size, | ||||||
|       fatal_error("Out of memory in allot_code_block", 0); |       fatal_error("Out of memory in allot_code_block", 0); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|   code_block* block = code->allocator->allot(block_size); |  | ||||||
| 
 | 
 | ||||||
|   // next time we do a minor GC, we have to trace this code block, since
 |   // next time we do a minor GC, we have to trace this code block, since
 | ||||||
|   // the fields of the code_block struct might point into nursery or aging
 |   // the fields of the code_block struct might point into nursery or aging
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue