X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Finterrupt.c;h=2e315622abcda5af629e6ca22126824f60a8d932;hb=7be8d1462a207bda809cd7553c5d76c6ebc4dda2;hp=0d426fa49055f2fa89bcf7206a367358b93a790e;hpb=c808a8c105050a5384c94418a8c80fafdfdc78c4;p=sbcl.git diff --git a/src/runtime/interrupt.c b/src/runtime/interrupt.c index 0d426fa..2e31562 100644 --- a/src/runtime/interrupt.c +++ b/src/runtime/interrupt.c @@ -609,23 +609,23 @@ build_fake_control_stack_frames(struct thread *th,os_context_t *context) /* Build a fake stack frame or frames */ - current_control_frame_pointer = + access_control_frame_pointer(th) = (lispobj *)(unsigned long) (*os_context_register_addr(context, reg_CSP)); if ((lispobj *)(unsigned long) (*os_context_register_addr(context, reg_CFP)) - == current_control_frame_pointer) { + == access_control_frame_pointer(th)) { /* There is a small window during call where the callee's * frame isn't built yet. */ if (lowtag_of(*os_context_register_addr(context, reg_CODE)) == FUN_POINTER_LOWTAG) { /* We have called, but not built the new frame, so * build it for them. */ - current_control_frame_pointer[0] = + access_control_frame_pointer(th)[0] = *os_context_register_addr(context, reg_OCFP); - current_control_frame_pointer[1] = + access_control_frame_pointer(th)[1] = *os_context_register_addr(context, reg_LRA); - current_control_frame_pointer += 8; + access_control_frame_pointer(th) += 8; /* Build our frame on top of it. */ oldcont = (lispobj)(*os_context_register_addr(context, reg_CFP)); } @@ -644,11 +644,11 @@ build_fake_control_stack_frames(struct thread *th,os_context_t *context) oldcont = (lispobj)(*os_context_register_addr(context, reg_CFP)); } - current_control_stack_pointer = current_control_frame_pointer + 8; + access_control_stack_pointer(th) = access_control_frame_pointer(th) + 8; - current_control_frame_pointer[0] = oldcont; - current_control_frame_pointer[1] = NIL; - current_control_frame_pointer[2] = + access_control_frame_pointer(th)[0] = oldcont; + access_control_frame_pointer(th)[1] = NIL; + access_control_frame_pointer(th)[2] = (lispobj)(*os_context_register_addr(context, reg_CODE)); #endif } @@ -666,8 +666,12 @@ fake_foreign_function_call(os_context_t *context) /* Get current Lisp state from context. */ #ifdef reg_ALLOC +#ifdef LISP_FEATURE_SB_THREAD + thread->pseudo_atomic_bits = +#else dynamic_space_free_pointer = (lispobj *)(unsigned long) +#endif (*os_context_register_addr(context, reg_ALLOC)); /* fprintf(stderr,"dynamic_space_free_pointer: %p\n", */ /* dynamic_space_free_pointer); */ @@ -684,9 +688,8 @@ fake_foreign_function_call(os_context_t *context) #endif #endif #ifdef reg_BSP - current_binding_stack_pointer = - (lispobj *)(unsigned long) - (*os_context_register_addr(context, reg_BSP)); + set_binding_stack_pointer(thread, + *os_context_register_addr(context, reg_BSP)); #endif build_fake_control_stack_frames(thread,context); @@ -728,7 +731,7 @@ undo_fake_foreign_function_call(os_context_t *context) /* Undo dynamic binding of FREE_INTERRUPT_CONTEXT_INDEX */ unbind(thread); -#ifdef reg_ALLOC +#if defined(reg_ALLOC) && !defined(LISP_FEATURE_SB_THREAD) /* Put the dynamic space free pointer back into the context. */ *os_context_register_addr(context, reg_ALLOC) = (unsigned long) dynamic_space_free_pointer @@ -740,6 +743,17 @@ undo_fake_foreign_function_call(os_context_t *context) | ((unsigned long) dynamic_space_free_pointer & LOWTAG_MASK); */ #endif +#if defined(reg_ALLOC) && defined(LISP_FEATURE_SB_THREAD) + /* Put the pseudo-atomic bits and dynamic space free pointer back + * into the context (p-a-bits for p-a, and dynamic space free + * pointer for ROOM). */ + *os_context_register_addr(context, reg_ALLOC) = + (unsigned long) dynamic_space_free_pointer + | (thread->pseudo_atomic_bits & LOWTAG_MASK); + /* And clear them so we don't get bit later by call-in/call-out + * not updating them. */ + thread->pseudo_atomic_bits = 0; +#endif } /* a handler for the signal caused by execution of a trap opcode @@ -1239,7 +1253,7 @@ sig_stop_for_gc_handler(int signal, siginfo_t *info, os_context_t *context) fixnum_value(thread->state)); } - set_thread_state(thread,STATE_SUSPENDED); + set_thread_state(thread,STATE_STOPPED); FSHOW_SIGNAL((stderr,"suspended\n")); /* While waiting for gc to finish occupy ourselves with zeroing @@ -1248,7 +1262,7 @@ sig_stop_for_gc_handler(int signal, siginfo_t *info, os_context_t *context) * actually a must. */ scrub_control_stack(); - wait_for_thread_state_change(thread, STATE_SUSPENDED); + wait_for_thread_state_change(thread, STATE_STOPPED); FSHOW_SIGNAL((stderr,"resumed\n")); if(thread_state(thread)!=STATE_RUNNING) { @@ -1461,7 +1475,7 @@ arrange_return_to_lisp_function(os_context_t *context, lispobj function) *os_context_register_addr(context,reg_LIP) = (os_context_register_t)(unsigned long)code; *os_context_register_addr(context,reg_CFP) = - (os_context_register_t)(unsigned long)current_control_frame_pointer; + (os_context_register_t)(unsigned long)access_control_frame_pointer(th); #endif #ifdef ARCH_HAS_NPC_REGISTER *os_context_npc_addr(context) =