void reset_allocator_parameters (unsigned long n_constant) { heap_reserved = DEFAULT_HEAP_RESERVED; gc_space_needed = 0; SET_STACK_LIMITS (memory_block_start, saved_stack_size); constant_start = (memory_block_start + saved_stack_size); constant_alloc_next = constant_start; constant_end = (constant_alloc_next + n_constant + CONSTANT_SPACE_FUDGE); heap_start = constant_end; Free = heap_start; heap_end = memory_block_end; RESET_HEAP_ALLOC_LIMIT (); INITIALIZE_STACK (); STACK_RESET (); }
static void setup_trap_frame (int signo, SIGINFO_T info, SIGCONTEXT_T * scp, struct trap_recovery_info * trinfo, SCHEME_OBJECT * new_stack_pointer) { unsigned long saved_mask = GET_INT_MASK; SCHEME_OBJECT handler; SCHEME_OBJECT signal_name; SET_INTERRUPT_MASK (0); /* To prevent GC for now. */ handler = ((VECTOR_P (fixed_objects)) ? (VECTOR_REF (fixed_objects, TRAP_HANDLER)) : SHARP_F); if (!INTERPRETER_APPLICABLE_P (handler)) { fprintf (stderr, "There is no trap handler for recovery!\n"); fflush (stderr); termination_trap (); } signal_name = ((signo != 0) ? (char_pointer_to_string (find_signal_name (signo))) : SHARP_F); if (!FREE_OK_P (Free)) REQUEST_GC (0); if (new_stack_pointer != 0) stack_pointer = new_stack_pointer; else { INITIALIZE_STACK (); Will_Push (CONTINUATION_SIZE); SET_RC (RC_END_OF_COMPUTATION); SET_EXP (SHARP_F); SAVE_CONT (); Pushed (); } Will_Push (7 + CONTINUATION_SIZE); STACK_PUSH (trinfo -> extra_trap_info); STACK_PUSH (trinfo -> pc_info_2); STACK_PUSH (trinfo -> pc_info_1); STACK_PUSH (trinfo -> state); STACK_PUSH (BOOLEAN_TO_OBJECT (new_stack_pointer != 0)); STACK_PUSH (find_signal_code_name (signo, info, scp)); STACK_PUSH (signal_name); SET_RC (RC_HARDWARE_TRAP); SET_EXP (long_to_integer (signo)); SAVE_CONT (); Pushed (); if ((new_stack_pointer != 0) /* This may want to do it in other cases, but this may be enough. */ && ((trinfo -> state) == STATE_COMPILED_CODE)) stop_history (); history_register = (make_dummy_history ()); Will_Push (STACK_ENV_EXTRA_SLOTS + 2); STACK_PUSH (signal_name); STACK_PUSH (handler); PUSH_APPLY_FRAME_HEADER (1); Pushed (); SET_INTERRUPT_MASK (saved_mask); abort_to_interpreter (PRIM_APPLY); }