From: Nikodemus S. <de...@us...> - 2007-04-30 09:37:43
|
Update of /cvsroot/sbcl/sbcl/src/runtime In directory sc8-pr-cvs8.sourceforge.net:/tmp/cvs-serv20057/src/runtime Modified Files: gc-common.c Log Message: 1.0.5.11: fix non-threaded build * SIG_STOP_FOR_GC only on threaded platforms. * GET-MUTEX was broken for non-threaded builds. Index: gc-common.c =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/gc-common.c,v retrieving revision 1.43 retrieving revision 1.44 diff -u -d -r1.43 -r1.44 --- gc-common.c 29 Apr 2007 15:51:02 -0000 1.43 +++ gc-common.c 30 Apr 2007 09:37:38 -0000 1.44 @@ -2469,6 +2469,7 @@ #ifndef LISP_FEATURE_WIN32 if(SymbolValue(INTERRUPTS_ENABLED,thread)!=NIL) { sigset_t *context_sigmask = os_context_sigmask_addr(context); +#ifdef LISP_FEATURE_SB_THREAD /* What if the context we'd like to restore has GC signals * blocked? Just skip the GC: we can't set GC_PENDING, because * that would block the next attempt, and we don't know when @@ -2478,11 +2479,15 @@ undo_fake_foreign_function_call(context); return 1; } +#endif thread_sigmask(SIG_SETMASK, context_sigmask, 0); } else unblock_gc_signals(); #endif + /* SIG_STOP_FOR_GC needs to be enabled before we can call lisp: + * otherwise two threads racing here may deadlock: the other will + * wait on the GC lock, and the other cannot stop the first one... */ funcall0(SymbolFunction(SUB_GC)); undo_fake_foreign_function_call(context); return 1; |