Update of /cvsroot/sbcl/sbcl/src/runtime
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv12850
Modified Files:
Tag: lutex-branch
interrupt.c
Log Message:
0.9.10.46.lutex-branch.9
* use
LISP_FEATURE_RESTORE_TLS_SEGMENT_REGISTER_FROM_CONTEXT. Surely
there's a better way.
* Add optional support for Carbon semaphores instead of mach
semaphores. Use :carbon-semaphores to turn on.
* install SIG_RESUME_FROM_GC handler
* send SIG_RESUME_FROM_GC instead of SIG_STOP_FOR_GC to tell
threads to start running again.
* Check to make sure that all threads have left the suspended
state before unlocking all_threads_lock and going on our merry
way.
* move #define in thread.c out of function body for readability.
* Add -framework CoreServices to build options when building with
:carbon-semaphores
* Add error checking on the i386_set_ldt call
* Free the LDT at thread cleanup time
* Make LDT stuff be #ifdef LISP_FEATURE_SB_THREAD
* Changed signal numbers and added SIG_RESUME_FROM_GC
(SIG_INTERRUPT_THREAD == SIGINFO, SIG_STOP_FOR_GC == SIGUSR1,
SIG_RESUME_FROM_GC == SIGUSR2)
* Treat SIG_RESUME_FROM_GC appropriately in interrupt.c
Index: interrupt.c
===================================================================
RCS file: /cvsroot/sbcl/sbcl/src/runtime/interrupt.c,v
retrieving revision 1.110.2.2
retrieving revision 1.110.2.3
diff -u -d -r1.110.2.2 -r1.110.2.3
--- interrupt.c 22 Mar 2006 23:41:35 -0000 1.110.2.2
+++ interrupt.c 25 Mar 2006 16:19:54 -0000 1.110.2.3
@@ -95,8 +95,12 @@
sigaddset(s, SIGVTALRM);
sigaddset(s, SIGPROF);
sigaddset(s, SIGWINCH);
+
+#if !(defined(LISP_FEATURE_DARWIN) && defined(LISP_FEATURE_SB_THREAD))
sigaddset(s, SIGUSR1);
sigaddset(s, SIGUSR2);
+#endif
+
#ifdef LISP_FEATURE_SB_THREAD
sigaddset(s, SIG_INTERRUPT_THREAD);
#endif
@@ -107,6 +111,9 @@
{
sigaddset_deferrable(s);
#ifdef LISP_FEATURE_SB_THREAD
+#ifdef LISP_FEATURE_DARWIN
+ sigaddset(s, SIG_RESUME_FROM_GC);
+#endif
sigaddset(s, SIG_STOP_FOR_GC);
#endif
}
@@ -324,7 +331,7 @@
{
lispobj context_sap;
-#if defined(LISP_FEATURE_DARWIN) && defined(LISP_FEATURE_X86) && defined(LISP_FEATURE_SB_THREAD)
+#if defined(LISP_FEATURE_RESTORE_TLS_SEGMENT_REGISTER_FROM_CONTEXT)
os_restore_tls_segment_register(context);
#endif
@@ -459,7 +466,7 @@
#endif
union interrupt_handler handler;
-#if defined(LISP_FEATURE_DARWIN) && defined(LISP_FEATURE_X86) && defined(LISP_FEATURE_SB_THREAD)
+#if defined(LISP_FEATURE_RESTORE_TLS_SEGMENT_REGISTER_FROM_CONTEXT)
os_restore_tls_segment_register(context);
#endif
@@ -529,6 +536,9 @@
sigset_t unblock;
sigemptyset(&unblock);
sigaddset(&unblock, SIG_STOP_FOR_GC);
+#ifdef LISP_FEATURE_DARWIN
+ sigaddset(&unblock, SIG_RESUME_FROM_GC);
+#endif
thread_sigmask(SIG_UNBLOCK, &unblock, 0);
}
#endif
@@ -665,7 +675,7 @@
struct thread *thread;
struct interrupt_data *data;
-#if defined(LISP_FEATURE_DARWIN) && defined(LISP_FEATURE_X86) && defined(LISP_FEATURE_SB_THREAD)
+#if defined(LISP_FEATURE_RESTORE_TLS_SEGMENT_REGISTER_FROM_CONTEXT)
os_restore_tls_segment_register(context);
#endif
@@ -694,7 +704,7 @@
os_restore_fp_control(context);
#endif
-#if defined(LISP_FEATURE_DARWIN) && defined(LISP_FEATURE_X86) && defined(LISP_FEATURE_SB_THREAD)
+#if defined(LISP_FEATURE_RESTORE_TLS_SEGMENT_REGISTER_FROM_CONTEXT)
os_restore_tls_segment_register(context);
#endif
@@ -714,7 +724,7 @@
struct thread *thread;
struct interrupt_data *data;
-#if defined(LISP_FEATURE_DARWIN) && defined(LISP_FEATURE_X86) && defined(LISP_FEATURE_SB_THREAD)
+#if defined(LISP_FEATURE_RESTORE_TLS_SEGMENT_REGISTER_FROM_CONTEXT)
os_restore_tls_segment_register(context);
#endif
@@ -738,14 +748,12 @@
#ifdef LISP_FEATURE_SB_THREAD
-#define SIG_STOP_FOR_GC_MASK 1 << (SIG_STOP_FOR_GC - 1)
-
void
sig_stop_for_gc_handler(int signal, siginfo_t *info, void *void_context)
{
os_context_t *context = arch_os_get_context(&void_context);
-#if defined(LISP_FEATURE_DARWIN) && defined(LISP_FEATURE_X86) && defined(LISP_FEATURE_SB_THREAD)
+#if defined(LISP_FEATURE_RESTORE_TLS_SEGMENT_REGISTER_FROM_CONTEXT)
os_restore_tls_segment_register(context);
#endif
@@ -776,17 +784,20 @@
thread->state=STATE_SUSPENDED;
FSHOW_SIGNAL((stderr,"thread=%lu suspended\n",thread->os_thread));
+#if defined(LISP_FEATURE_DARWIN)
+ sigemptyset(&ss); sigaddset(&ss,SIG_RESUME_FROM_GC);
+#else
sigemptyset(&ss); sigaddset(&ss,SIG_STOP_FOR_GC);
+#endif
+
/* It is possible to get SIGCONT (and probably other
* non-blockable signals) here. */
#ifdef LISP_FEATURE_DARWIN
{
int sigret;
do { sigwait(&ss, &sigret); }
- while (sigret != SIG_STOP_FOR_GC);
+ while (sigret != SIG_RESUME_FROM_GC);
}
- /* do { sigpending(&ss); } while(!sigismember(&ss, SIG_STOP_FOR_GC)); */
- /* while (sigpending(&ss), !(ss & SIG_STOP_FOR_GC_MASK)); */
#else
while (sigwaitinfo(&ss,0) != SIG_STOP_FOR_GC);
#endif
@@ -985,7 +996,7 @@
{
os_context_t *context = (os_context_t*)arch_os_get_context(&v_context);
-#if defined(LISP_FEATURE_DARWIN) && defined(LISP_FEATURE_X86) && defined(LISP_FEATURE_SB_THREAD)
+#if defined(LISP_FEATURE_RESTORE_TLS_SEGMENT_REGISTER_FROM_CONTEXT)
os_restore_tls_segment_register(context);
#endif
@@ -1125,6 +1136,9 @@
else {
sigset_t new;
sigemptyset(&new);
+#if defined(LISP_FEATURE_DARWIN)
+ sigaddset(&new,SIG_RESUME_FROM_GC);
+#endif
sigaddset(&new,SIG_STOP_FOR_GC);
thread_sigmask(SIG_UNBLOCK,&new,0);
}
|