X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fsafepoint.c;h=45af50e5b35121b3d8d0fc2d638a428cc5d24c22;hb=5f0bd05a15aaf93f46baf9b8aa3e9b0bfbca26ab;hp=8a34a084e20d8b57880112d46acfc998ba5d325d;hpb=d1a2fa597f993d56bcfa73a64509465d56b4ffac;p=sbcl.git diff --git a/src/runtime/safepoint.c b/src/runtime/safepoint.c index 8a34a08..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,17 @@ 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 */