VM: try and recover with a kernel error from the callback heap running out
							parent
							
								
									1824680ad1
								
							
						
					
					
						commit
						4867e7bc96
					
				| 
						 | 
				
			
			@ -148,6 +148,9 @@ HOOK: signal-error. os ( obj -- )
 | 
			
		|||
: interrupt-error. ( error -- )
 | 
			
		||||
    "Interrupt" print drop ;
 | 
			
		||||
 | 
			
		||||
: callback-space-overflow. ( error -- )
 | 
			
		||||
    "Callback space overflow" print drop ;
 | 
			
		||||
 | 
			
		||||
PREDICATE: vm-error < array
 | 
			
		||||
    dup length 2 < [ drop f ] [
 | 
			
		||||
        {
 | 
			
		||||
| 
						 | 
				
			
			@ -178,6 +181,7 @@ PREDICATE: vm-error < array
 | 
			
		|||
        [ memory-error.            ]
 | 
			
		||||
        [ fp-trap-error.           ]
 | 
			
		||||
        [ interrupt-error.         ]
 | 
			
		||||
        [ callback-space-overflow. ]
 | 
			
		||||
    } ; inline
 | 
			
		||||
 | 
			
		||||
M: vm-error summary drop "VM error" ;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -352,6 +352,8 @@ CONSTANT: OBJ-WAITING-CALLBACKS 73
 | 
			
		|||
 | 
			
		||||
CONSTANT: OBJ-SIGNAL-PIPE 74
 | 
			
		||||
 | 
			
		||||
CONSTANT: OBJ-INSTALL-PREFIX 75
 | 
			
		||||
 | 
			
		||||
! Context object count and identifiers must be kept in sync with:
 | 
			
		||||
!   vm/contexts.hpp
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -363,9 +365,10 @@ CONSTANT: CONTEXT-OBJ-CONTEXT 2
 | 
			
		|||
CONSTANT: CONTEXT-OBJ-IN-CALLBACK-P 3
 | 
			
		||||
 | 
			
		||||
! Runtime errors must be kept in sync with:
 | 
			
		||||
!   basis/debugger/debugger.factor
 | 
			
		||||
!   vm/errors.hpp
 | 
			
		||||
 | 
			
		||||
CONSTANT: kernel-error-count 20
 | 
			
		||||
CONSTANT: kernel-error-count 21
 | 
			
		||||
 | 
			
		||||
CONSTANT: ERROR-EXPIRED 0
 | 
			
		||||
CONSTANT: ERROR-IO      1
 | 
			
		||||
| 
						 | 
				
			
			@ -387,5 +390,6 @@ CONSTANT: ERROR-CALLSTACK-OVERFLOW 16
 | 
			
		|||
CONSTANT: ERROR-MEMORY 17
 | 
			
		||||
CONSTANT: ERROR-FP-TRAP 18
 | 
			
		||||
CONSTANT: ERROR-INTERRUPT 19
 | 
			
		||||
CONSTANT: ERROR-CALLBACK-SPACE-OVERFLOW 20
 | 
			
		||||
 | 
			
		||||
PRIVATE>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -61,8 +61,12 @@ code_block* callback_heap::add(cell owner, cell return_rewind) {
 | 
			
		|||
  cell size = array_capacity(insns.untagged());
 | 
			
		||||
 | 
			
		||||
  cell bump = align(size + sizeof(code_block), data_alignment);
 | 
			
		||||
  if (here + bump > seg->end)
 | 
			
		||||
    fatal_error("Out of callback space", 0);
 | 
			
		||||
 | 
			
		||||
  if (here + bump > seg->end) {
 | 
			
		||||
    parent->general_error(ERROR_CALLBACK_SPACE_OVERFLOW,
 | 
			
		||||
                          false_object,
 | 
			
		||||
                          false_object);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  free_heap_block* free_block = (free_heap_block*)here;
 | 
			
		||||
  free_block->make_free(bump);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -24,6 +24,7 @@ enum vm_error_type {
 | 
			
		|||
  ERROR_MEMORY,
 | 
			
		||||
  ERROR_FP_TRAP,
 | 
			
		||||
  ERROR_INTERRUPT,
 | 
			
		||||
  ERROR_CALLBACK_SPACE_OVERFLOW
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void fatal_error(const char* msg, cell tagged);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue