lose("gc_blocked_deferrables and interrupt pending\n.");
if (data->gc_blocked_deferrables)
check_deferrables_blocked_in_sigset_or_lose(sigset);
- if (interrupt_pending || interrupt_deferred_p)
+ if (interrupt_pending || interrupt_deferred_p ||
+ data->gc_blocked_deferrables)
check_deferrables_blocked_in_sigset_or_lose(sigset);
else {
check_deferrables_unblocked_in_sigset_or_lose(sigset);
FSHOW((stderr, "/entering POSIX install_handler(%d, ..)\n", signal));
- sigemptyset(&new);
- sigaddset(&new, signal);
- thread_sigmask(SIG_BLOCK, &new, &old);
+ thread_sigmask(SIG_BLOCK, &blockable_sigset, &old);
FSHOW((stderr, "/interrupt_low_level_handlers[signal]=%x\n",
(unsigned int)interrupt_low_level_handlers[signal]));
int status;
if (os_thread != 0)
lose("kill_safely: who do you want to kill? %d?\n", os_thread);
+ /* Dubious (as in don't know why it works) workaround for the
+ * signal sometimes not being generated on darwin. */
+#ifdef LISP_FEATURE_DARWIN
+ {
+ sigset_t oldset;
+ sigprocmask(SIG_BLOCK, &deferrable_sigset, &oldset);
+ status = raise(signal);
+ sigprocmask(SIG_SETMASK,&oldset,0);
+ }
+#else
status = raise(signal);
+#endif
if (status == 0) {
return 0;
} else {
/* mach_msg_server should never return, but it should dispatch mach
* exceptions to our catch_exception_raise function
*/
- abort();
+ lose("mach_msg_server returned");
}
/* Sets up the thread that will listen for mach exceptions. note that
/* mach_msg_server should never return, but it should dispatch mach
* exceptions to our catch_exception_raise function
*/
- abort();
+ lose("mach_msg_server returned");
}
#endif
;;; checkins which aren't released. (And occasionally for internal
;;; versions, especially for internal versions off the main CVS
;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".)
-"1.0.26.9"
+"1.0.26.10"