X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fthread.c;h=838a187cdbd02a6678a7c4a8f7128b5b17ea0f52;hb=d1a2fa597f993d56bcfa73a64509465d56b4ffac;hp=cc9eebd0ed3cec0c8a8385be10b5f5a843d574d6;hpb=7aef55b130d95c384b63422807f1848faa9aba5a;p=sbcl.git diff --git a/src/runtime/thread.c b/src/runtime/thread.c index cc9eebd..838a187 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -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;