X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fsafepoint.c;h=45af50e5b35121b3d8d0fc2d638a428cc5d24c22;hb=bf40ae88bc289fd765a33861cc4bc0853ed483ba;hp=3faabe56bb130b15cb468744d26fd5357c677054;hpb=fd8e8143cf02ac767e2a46a2bc526933e68ef583;p=sbcl.git diff --git a/src/runtime/safepoint.c b/src/runtime/safepoint.c index 3faabe5..45af50e 100644 --- a/src/runtime/safepoint.c +++ b/src/runtime/safepoint.c @@ -966,6 +966,26 @@ handle_safepoint_violation(os_context_t *ctx, os_vm_address_t fault_address) } #endif /* LISP_FEATURE_WIN32 */ +#if defined(LISP_FEATURE_SB_SAFEPOINT_STRICTLY) && !defined(LISP_FEATURE_WIN32) +void +signal_handler_callback(lispobj run_handler, int signo, void *info, void *ctx) +{ + init_thread_data scribble; + void *args[2]; + args[0] = info; + args[1] = ctx; + + attach_os_thread(&scribble); + + odxprint(misc, "callback from signal handler thread for: %d\n", signo); + funcall3(StaticSymbolFunction(SIGNAL_HANDLER_CALLBACK), + run_handler, make_fixnum(signo), alloc_sap(args)); + + detach_os_thread(&scribble); + return; +} +#endif + void callback_wrapper_trampoline( #if !(defined(LISP_FEATURE_X86) || defined(LISP_FEATURE_X86_64)) @@ -979,9 +999,22 @@ callback_wrapper_trampoline( #endif lispobj arg0, lispobj arg1, lispobj arg2) { +#if defined(LISP_FEATURE_WIN32) + pthread_np_notice_thread(); +#endif struct thread* th = arch_os_get_current_thread(); - if (!th) - lose("callback invoked in non-lisp thread. Sorry, that is not supported yet."); + if (!th) { /* callback invoked in non-lisp thread */ + init_thread_data scribble; + attach_os_thread(&scribble); + funcall3(StaticSymbolFunction(ENTER_FOREIGN_CALLBACK), arg0,arg1,arg2); + detach_os_thread(&scribble); + return; + } + +#ifdef LISP_FEATURE_WIN32 + /* arg2 is the pointer to a return value, which sits on the stack */ + th->carried_base_pointer = (os_context_register_t) *(((void**)arg2)-1); +#endif WITH_GC_AT_SAFEPOINTS_ONLY() funcall3(SymbolValue(ENTER_ALIEN_CALLBACK, 0), arg0, arg1, arg2);