X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fthread.h;h=8f0436fa2a48d2ffde26a0509ae3596957367821;hb=3b90774a1ea68bf42579594c872de16fb33f1454;hp=21521116bc0bd6b1174e971c0da2014a6473b2b1;hpb=402958f92506b9d3de852601b8c1ccb99b5ee558;p=sbcl.git diff --git a/src/runtime/thread.h b/src/runtime/thread.h index 2152111..8f0436f 100644 --- a/src/runtime/thread.h +++ b/src/runtime/thread.h @@ -121,6 +121,16 @@ static inline struct thread *arch_os_get_current_thread() { 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))); @@ -134,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 @@ -149,5 +164,6 @@ static inline struct thread *arch_os_get_current_thread() { #endif extern void create_initial_thread(lispobj); +extern int kill_thread_safely(os_thread_t os_thread, int signo); #endif /* _INCLUDE_THREAD_H_ */