X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fbsd-os.c;h=f1697200f9f7655728f229ad726dd97eb255dae7;hb=02d7495253b9075e4d86275590c3e827c814b596;hp=8c973968f11253e1f6c7c0b618985db937800376;hpb=4023b1bec2412344e5eea4a33cd85dd662149c67;p=sbcl.git diff --git a/src/runtime/bsd-os.c b/src/runtime/bsd-os.c index 8c97396..f169720 100644 --- a/src/runtime/bsd-os.c +++ b/src/runtime/bsd-os.c @@ -59,6 +59,9 @@ static void netbsd_init(); #ifdef __FreeBSD__ #include +#if defined(LISP_FEATURE_SB_THREAD) && !defined(LISP_FEATURE_SB_PTHREAD_FUTEX) +#include +#endif static void freebsd_init(); #endif /* __FreeBSD__ */ @@ -211,10 +214,6 @@ memory_fault_handler(int signal, siginfo_t *siginfo, void *void_context if (!maybe_gc(context)) { interrupt_handle_now(signal, siginfo, context); } -#if defined(LISP_FEATURE_DARWIN) - /* Work around G5 bug; fix courtesy gbyers */ - DARWIN_FIX_CONTEXT(context); -#endif #endif } } @@ -239,13 +238,6 @@ os_install_interrupt_handlers(void) (__siginfohandler_t *) #endif memory_fault_handler); -#ifdef SIG_MEMORY_FAULT2 - undoably_install_low_level_interrupt_handler(SIG_MEMORY_FAULT2, -#ifdef LISP_FEATURE_FREEBSD - (__siginfohandler_t *) -#endif - memory_fault_handler); -#endif #endif #ifdef LISP_FEATURE_SB_THREAD @@ -276,8 +268,6 @@ sigsegv_handler(int signal, siginfo_t *info, void* void_context) if (!cheneygc_handle_wp_violation(context, addr)) if (!handle_guard_page_triggered(context, addr)) interrupt_handle_now(signal, info, context); - /* Work around G5 bug; fix courtesy gbyers */ - DARWIN_FIX_CONTEXT(context); } void @@ -286,10 +276,6 @@ os_install_interrupt_handlers(void) SHOW("os_install_interrupt_handlers()/bsd-os/!defined(GENCGC)"); undoably_install_low_level_interrupt_handler(SIG_MEMORY_FAULT, sigsegv_handler); -#ifdef SIG_MEMORY_FAULT2 - undoably_install_low_level_interrupt_handler(SIG_MEMORY_FAULT2, - sigsegv_handler); -#endif } #endif /* defined GENCGC */ @@ -372,8 +358,19 @@ _socket(int domain, int type, int protocol) #endif /* __NetBSD__ */ #ifdef __FreeBSD__ +extern int getosreldate(void); + +int sig_memory_fault; + static void freebsd_init() { + /* Memory fault signal on FreeBSD was changed from SIGBUS to + * SIGSEGV. */ + if (getosreldate() < 700004) + sig_memory_fault = SIGBUS; + else + sig_memory_fault = SIGSEGV; + /* Quote from sbcl-devel (NIIMI Satoshi): "Some OSes, like FreeBSD * 4.x with GENERIC kernel, does not enable SSE support even on * SSE capable CPUs". Detect this situation and skip the @@ -381,17 +378,56 @@ static void freebsd_init() * x86-assem.S. */ #ifdef LISP_FEATURE_X86 - size_t len; - int instruction_sse; - - len = sizeof(instruction_sse); - if (sysctlbyname("hw.instruction_sse", &instruction_sse, &len, NULL, 0) == 0 - && instruction_sse != 0) { - /* Use the SSE detector */ - fast_bzero_pointer = fast_bzero_detect; + { + size_t len; + int instruction_sse; + + len = sizeof(instruction_sse); + if (sysctlbyname("hw.instruction_sse", &instruction_sse, &len, + NULL, 0) == 0 && instruction_sse != 0) { + /* Use the SSE detector */ + fast_bzero_pointer = fast_bzero_detect; + } } #endif /* LISP_FEATURE_X86 */ } + +#if defined(LISP_FEATURE_SB_THREAD) && !defined(LISP_FEATURE_SB_PTHREAD_FUTEX) +int +futex_wait(int *lock_word, long oldval, long sec, unsigned long usec) +{ + struct timespec timeout; + int ret; + +again: + if (sec < 0) + ret = umtx_wait((void *)lock_word, oldval, NULL); + else { + timeout.tv_sec = sec; + timeout.tv_nsec = usec * 1000; + ret = umtx_wait((void *)lock_word, oldval, &timeout); + } + + switch (ret) { + case 0: + return 0; + case ETIMEDOUT: + return 1; + case EINTR: + /* spurious wakeup from interrupt */ + goto again; + default: + /* EWOULDBLOCK and others, need to check the lock */ + return -1; + } +} + +int +futex_wake(int *lock_word, int n) +{ + return umtx_wake((void *)lock_word, n); +} +#endif #endif /* __FreeBSD__ */ #ifdef LISP_FEATURE_DARWIN @@ -401,8 +437,6 @@ static void freebsd_init() #define KERN_PROC_PATHNAME 12 #endif -extern int getosreldate(void); - char * os_get_runtime_executable_path() {