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-error. ( error -- )
|
||||||
"Interrupt" print drop ;
|
"Interrupt" print drop ;
|
||||||
|
|
||||||
|
: callback-space-overflow. ( error -- )
|
||||||
|
"Callback space overflow" print drop ;
|
||||||
|
|
||||||
PREDICATE: vm-error < array
|
PREDICATE: vm-error < array
|
||||||
dup length 2 < [ drop f ] [
|
dup length 2 < [ drop f ] [
|
||||||
{
|
{
|
||||||
|
@ -158,26 +161,27 @@ PREDICATE: vm-error < array
|
||||||
|
|
||||||
: vm-errors ( error -- n errors )
|
: vm-errors ( error -- n errors )
|
||||||
second {
|
second {
|
||||||
[ expired-error. ]
|
[ expired-error. ]
|
||||||
[ io-error. ]
|
[ io-error. ]
|
||||||
[ primitive-error. ]
|
[ primitive-error. ]
|
||||||
[ type-check-error. ]
|
[ type-check-error. ]
|
||||||
[ divide-by-zero-error. ]
|
[ divide-by-zero-error. ]
|
||||||
[ signal-error. ]
|
[ signal-error. ]
|
||||||
[ array-size-error. ]
|
[ array-size-error. ]
|
||||||
[ fixnum-range-error. ]
|
[ fixnum-range-error. ]
|
||||||
[ c-string-error. ]
|
[ c-string-error. ]
|
||||||
[ ffi-error. ]
|
[ ffi-error. ]
|
||||||
[ undefined-symbol-error. ]
|
[ undefined-symbol-error. ]
|
||||||
[ datastack-underflow. ]
|
[ datastack-underflow. ]
|
||||||
[ datastack-overflow. ]
|
[ datastack-overflow. ]
|
||||||
[ retainstack-underflow. ]
|
[ retainstack-underflow. ]
|
||||||
[ retainstack-overflow. ]
|
[ retainstack-overflow. ]
|
||||||
[ callstack-underflow. ]
|
[ callstack-underflow. ]
|
||||||
[ callstack-overflow. ]
|
[ callstack-overflow. ]
|
||||||
[ memory-error. ]
|
[ memory-error. ]
|
||||||
[ fp-trap-error. ]
|
[ fp-trap-error. ]
|
||||||
[ interrupt-error. ]
|
[ interrupt-error. ]
|
||||||
|
[ callback-space-overflow. ]
|
||||||
} ; inline
|
} ; inline
|
||||||
|
|
||||||
M: vm-error summary drop "VM error" ;
|
M: vm-error summary drop "VM error" ;
|
||||||
|
|
|
@ -352,6 +352,8 @@ CONSTANT: OBJ-WAITING-CALLBACKS 73
|
||||||
|
|
||||||
CONSTANT: OBJ-SIGNAL-PIPE 74
|
CONSTANT: OBJ-SIGNAL-PIPE 74
|
||||||
|
|
||||||
|
CONSTANT: OBJ-INSTALL-PREFIX 75
|
||||||
|
|
||||||
! Context object count and identifiers must be kept in sync with:
|
! Context object count and identifiers must be kept in sync with:
|
||||||
! vm/contexts.hpp
|
! vm/contexts.hpp
|
||||||
|
|
||||||
|
@ -363,9 +365,10 @@ CONSTANT: CONTEXT-OBJ-CONTEXT 2
|
||||||
CONSTANT: CONTEXT-OBJ-IN-CALLBACK-P 3
|
CONSTANT: CONTEXT-OBJ-IN-CALLBACK-P 3
|
||||||
|
|
||||||
! Runtime errors must be kept in sync with:
|
! Runtime errors must be kept in sync with:
|
||||||
|
! basis/debugger/debugger.factor
|
||||||
! vm/errors.hpp
|
! vm/errors.hpp
|
||||||
|
|
||||||
CONSTANT: kernel-error-count 20
|
CONSTANT: kernel-error-count 21
|
||||||
|
|
||||||
CONSTANT: ERROR-EXPIRED 0
|
CONSTANT: ERROR-EXPIRED 0
|
||||||
CONSTANT: ERROR-IO 1
|
CONSTANT: ERROR-IO 1
|
||||||
|
@ -387,5 +390,6 @@ CONSTANT: ERROR-CALLSTACK-OVERFLOW 16
|
||||||
CONSTANT: ERROR-MEMORY 17
|
CONSTANT: ERROR-MEMORY 17
|
||||||
CONSTANT: ERROR-FP-TRAP 18
|
CONSTANT: ERROR-FP-TRAP 18
|
||||||
CONSTANT: ERROR-INTERRUPT 19
|
CONSTANT: ERROR-INTERRUPT 19
|
||||||
|
CONSTANT: ERROR-CALLBACK-SPACE-OVERFLOW 20
|
||||||
|
|
||||||
PRIVATE>
|
PRIVATE>
|
||||||
|
|
|
@ -61,8 +61,12 @@ code_block* callback_heap::add(cell owner, cell return_rewind) {
|
||||||
cell size = array_capacity(insns.untagged());
|
cell size = array_capacity(insns.untagged());
|
||||||
|
|
||||||
cell bump = align(size + sizeof(code_block), data_alignment);
|
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_heap_block* free_block = (free_heap_block*)here;
|
||||||
free_block->make_free(bump);
|
free_block->make_free(bump);
|
||||||
|
|
|
@ -24,6 +24,7 @@ enum vm_error_type {
|
||||||
ERROR_MEMORY,
|
ERROR_MEMORY,
|
||||||
ERROR_FP_TRAP,
|
ERROR_FP_TRAP,
|
||||||
ERROR_INTERRUPT,
|
ERROR_INTERRUPT,
|
||||||
|
ERROR_CALLBACK_SPACE_OVERFLOW
|
||||||
};
|
};
|
||||||
|
|
||||||
void fatal_error(const char* msg, cell tagged);
|
void fatal_error(const char* msg, cell tagged);
|
||||||
|
|
Loading…
Reference in New Issue