Some support for platforms whose libraries do not maintain a frame pointer
[sbcl.git] / src / runtime / thread.c
index cc9eebd..838a187 100644 (file)
@@ -96,7 +96,11 @@ pthread_key_t lisp_thread = 0;
 #endif
 
 #if defined(LISP_FEATURE_X86) || defined(LISP_FEATURE_X86_64)
-extern lispobj call_into_lisp_first_time(lispobj fun, lispobj *args, int nargs);
+extern lispobj call_into_lisp_first_time(lispobj fun, lispobj *args, int nargs)
+# ifdef LISP_FEATURE_X86_64
+    __attribute__((sysv_abi))
+# endif
+    ;
 #endif
 
 static void
@@ -120,6 +124,7 @@ unlink_thread(struct thread *th)
         th->next->prev = th->prev;
 }
 
+#ifndef LISP_FEATURE_SB_SAFEPOINT
 /* Only access thread state with blockables blocked. */
 lispobj
 thread_state(struct thread *thread)
@@ -193,7 +198,8 @@ wait_for_thread_state_change(struct thread *thread, lispobj state)
     }
     thread_sigmask(SIG_SETMASK, &old, NULL);
 }
-#endif
+#endif /* sb-safepoint */
+#endif /* sb-thread */
 
 static int
 initial_thread_trampoline(struct thread *th)
@@ -212,9 +218,6 @@ initial_thread_trampoline(struct thread *th)
     function = th->no_tls_value_marker;
     th->no_tls_value_marker = NO_TLS_VALUE_MARKER_WIDETAG;
     if(arch_os_thread_init(th)==0) return 1;
-#ifdef LISP_FEATURE_SB_SAFEPOINT
-    pthread_mutex_lock(thread_qrl(th));
-#endif
     link_thread(th);
     th->os_thread=thread_self();
 #ifndef LISP_FEATURE_WIN32
@@ -380,7 +383,6 @@ new_thread_trampoline(struct thread *th)
      * it is not). */
 #ifdef LISP_FEATURE_SB_SAFEPOINT
     *th->csp_around_foreign_call = (lispobj)&function;
-    pthread_mutex_lock(thread_qrl(th));
 #endif
     lock_ret = pthread_mutex_lock(&all_threads_lock);
     gc_assert(lock_ret == 0);
@@ -392,6 +394,9 @@ new_thread_trampoline(struct thread *th)
      * non-safepoint versions of this code.  Can we unify this more?
      */
 #ifdef LISP_FEATURE_SB_SAFEPOINT
+    gc_state_lock();
+    gc_state_wait(GC_NONE);
+    gc_state_unlock();
     WITH_GC_AT_SAFEPOINTS_ONLY() {
         result = funcall0(function);
         block_blockable_signals(0, 0);
@@ -402,8 +407,6 @@ new_thread_trampoline(struct thread *th)
     unlink_thread(th);
     lock_ret = pthread_mutex_unlock(&all_threads_lock);
     gc_assert(lock_ret == 0);
-    pthread_mutex_unlock(thread_qrl(th));
-    set_thread_state(th,STATE_DEAD);
 #else
     result = funcall0(function);
 
@@ -423,9 +426,11 @@ new_thread_trampoline(struct thread *th)
 #endif
 
     if(th->tls_cookie>=0) arch_os_thread_cleanup(th);
+#ifndef LISP_FEATURE_SB_SAFEPOINT
     os_sem_destroy(th->state_sem);
     os_sem_destroy(th->state_not_running_sem);
     os_sem_destroy(th->state_not_stopped_sem);
+#endif
 
 #if defined(LISP_FEATURE_WIN32)
     free((os_vm_address_t)th->interrupt_data);
@@ -508,9 +513,9 @@ create_thread_struct(lispobj initial_function) {
         return NULL;
     /* Aligning up is safe as THREAD_STRUCT_SIZE has
      * THREAD_ALIGNMENT_BYTES padding. */
-    aligned_spaces = (void *)((((unsigned long)(char *)spaces)
+    aligned_spaces = (void *)((((uword_t)(char *)spaces)
                                + THREAD_ALIGNMENT_BYTES-1)
-                              &~(unsigned long)(THREAD_ALIGNMENT_BYTES-1));
+                              &~(uword_t)(THREAD_ALIGNMENT_BYTES-1));
     void* csp_page=
         (aligned_spaces+
          thread_control_stack_size+
@@ -563,7 +568,12 @@ create_thread_struct(lispobj initial_function) {
     th->os_thread=0;
 
 #ifdef LISP_FEATURE_SB_SAFEPOINT
+# ifdef LISP_FEATURE_WIN32
+    th->carried_base_pointer = 0;
+# endif
+# ifdef LISP_FEATURE_C_STACK_IS_CONTROL_STACK
     th->pc_around_foreign_call = 0;
+# endif
     th->csp_around_foreign_call = csp_page;
 #endif
 
@@ -574,17 +584,16 @@ create_thread_struct(lispobj initial_function) {
      * separately */
     th->os_attr=malloc(sizeof(pthread_attr_t));
     th->nonpointer_data = nonpointer_data;
+# ifndef LISP_FEATURE_SB_SAFEPOINT
     th->state_sem=&nonpointer_data->state_sem;
     th->state_not_running_sem=&nonpointer_data->state_not_running_sem;
     th->state_not_stopped_sem=&nonpointer_data->state_not_stopped_sem;
-    th->state_not_running_waitcount = 0;
-    th->state_not_stopped_waitcount = 0;
     os_sem_init(th->state_sem, 1);
     os_sem_init(th->state_not_running_sem, 0);
     os_sem_init(th->state_not_stopped_sem, 0);
-# ifdef LISP_FEATURE_SB_SAFEPOINT
-    pthread_mutex_init(thread_qrl(th), NULL);
 # endif
+    th->state_not_running_waitcount = 0;
+    th->state_not_stopped_waitcount = 0;
 #endif
     th->state=STATE_RUNNING;
 #ifdef LISP_FEATURE_STACK_GROWS_DOWNWARD_NOT_UPWARD
@@ -674,6 +683,7 @@ create_thread_struct(lispobj initial_function) {
            sizeof(th->private_events.events[0]); ++i) {
       th->private_events.events[i] = CreateEvent(NULL,FALSE,FALSE,NULL);
     }
+    th->synchronous_io_handle_and_flag = 0;
 #endif
     th->stepping = NIL;
     return th;