X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fthread.h;h=8f0436fa2a48d2ffde26a0509ae3596957367821;hb=3106aee96a20d1a76a114e504bc2931f8196cace;hp=78367d4163d1bc2343b1d35d03e0d147d2a31566;hpb=d724066ca963f974b47f1a51af13ff9d680392db;p=sbcl.git diff --git a/src/runtime/thread.h b/src/runtime/thread.h index 78367d4..8f0436f 100644 --- a/src/runtime/thread.h +++ b/src/runtime/thread.h @@ -113,9 +113,28 @@ static inline struct thread *arch_os_get_current_thread() { #if defined(LISP_FEATURE_SB_THREAD) #if defined(LISP_FEATURE_X86) register struct thread *me=0; - if(all_threads) + if(all_threads) { +#if defined(LISP_FEATURE_DARWIN) && defined(LISP_FEATURE_RESTORE_FS_SEGMENT_REGISTER_FROM_TLS) + sel_t sel; + struct thread *th = pthread_getspecific(specials); + sel.index = th->tls_cookie; + sel.rpl = USER_PRIV; + sel.ti = SEL_LDT; + __asm__ __volatile__ ("movw %w0, %%fs" : : "r"(sel)); +#elif defined(LISP_FEATURE_FREEBSD) && defined(LISP_FEATURE_RESTORE_TLS_SEGMENT_REGISTER_FROM_TLS) + struct thread *th = pthread_getspecific(specials); + unsigned int sel = LSEL(th->tls_cookie, SEL_UPL); + unsigned int fs = rfs(); + + /* Load FS only if it's necessary. Modifying a selector + * causes privilege checking and it takes long time. */ + if (fs != sel) + load_fs(sel); + return th; +#endif __asm__ __volatile__ ("movl %%fs:%c1,%0" : "=r" (me) : "i" (offsetof (struct thread,this))); + } return me; #else return pthread_getspecific(specials); @@ -125,6 +144,11 @@ static inline struct thread *arch_os_get_current_thread() { #endif } +#if defined(LISP_FEATURE_MACH_EXCEPTION_HANDLER) +#define THREAD_STRUCT_TO_EXCEPTION_PORT(th) ((mach_port_t) th) +#define EXCEPTION_PORT_TO_THREAD_STRUCT(th) ((struct thread *) th) +#endif + #if defined(LISP_FEATURE_SB_THREAD) #define thread_self pthread_self #define thread_kill pthread_kill @@ -135,10 +159,11 @@ static inline struct thread *arch_os_get_current_thread() { #define thread_self getpid #define thread_kill kill #define thread_sigmask sigprocmask -#define thread_mutex_lock(l) -#define thread_mutex_unlock(l) +#define thread_mutex_lock(l) 0 +#define thread_mutex_unlock(l) 0 #endif extern void create_initial_thread(lispobj); +extern int kill_thread_safely(os_thread_t os_thread, int signo); #endif /* _INCLUDE_THREAD_H_ */