X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Flinux-os.c;h=4c6ef832e79dfd8d022fe13de4c592d9fdc2c679;hb=4efb45cc0b0b9c3109d7cfd72f3f35de2ca4727e;hp=778f72cb2bc348eaf0bc74b1321d4c1f07f2223e;hpb=b27fb452f72190637b03a6ef2e1333091da42a98;p=sbcl.git diff --git a/src/runtime/linux-os.c b/src/runtime/linux-os.c index 778f72c..4c6ef83 100644 --- a/src/runtime/linux-os.c +++ b/src/runtime/linux-os.c @@ -34,8 +34,10 @@ #include "runtime.h" #include "genesis/static-symbols.h" #include "genesis/fdefn.h" + #include #include +#include #include #include @@ -60,7 +62,7 @@ int personality (unsigned long); size_t os_vm_page_size; -#ifdef LISP_FEATURE_SB_THREAD +#if defined(LISP_FEATURE_SB_THREAD) && !defined(LISP_FEATURE_SB_LUTEX) && !defined(LISP_FEATURE_SB_PTHREAD_FUTEX) #include #include #include @@ -82,7 +84,18 @@ static inline int sys_futex (void *futex, int op, int val, struct timespec *rel) int futex_wait(int *lock_word, int oldval) { - int t= sys_futex(lock_word,FUTEX_WAIT,oldval, 0); + int t; + again: + t = sys_futex(lock_word,FUTEX_WAIT,oldval, 0); + + /* Interrupted FUTEX_WAIT calls may return early. + * + * If someone manages to wake the futex while we're spinning + * around it, we will just return with -1 and errno EWOULDBLOCK, + * because the value has changed, so that's ok. */ + if (t != 0 && errno == EINTR) + goto again; + return t; } @@ -95,6 +108,20 @@ futex_wake(int *lock_word, int n) int linux_sparc_siginfo_bug = 0; + +/* This variable was in real use for a few months, basically for + * storing autodetected information about whether the Linux + * installation was recent enough to support SBCL threads, and make + * some run-time decisions based on that. But this turned out to be + * unstable, so now we just flat-out refuse to start on the old installations + * when thread support has been compiled in. + * + * Unfortunately, in the meanwhile Slime started depending on this + * variable for deciding which communication style to use. So even + * though this variable looks unused, it shouldn't be deleted until + * it's no longer used in the versions of Slime that people are + * likely to download first. -- JES, 2006-06-07 + */ int linux_no_threads_p = 0; #ifdef LISP_FEATURE_SB_THREAD @@ -118,7 +145,7 @@ os_init(char *argv[], char *envp[]) { /* Conduct various version checks: do we have enough mmap(), is * this a sparc running 2.2, can we do threads? */ -#ifdef LISP_FEATURE_SB_THREAD +#if defined(LISP_FEATURE_SB_THREAD) && !defined(LISP_FEATURE_SB_LUTEX) && !defined(LISP_FEATURE_SB_PTHREAD_FUTEX) int *futex=0; #endif struct utsname name; @@ -144,12 +171,14 @@ os_init(char *argv[], char *envp[]) #endif } #ifdef LISP_FEATURE_SB_THREAD +#if !defined(LISP_FEATURE_SB_LUTEX) && !defined(LISP_FEATURE_SB_PTHREAD_FUTEX) futex_wait(futex,-1); if(errno==ENOSYS) { lose("This version of SBCL is compiled with threading support, but your kernel\n" "is too old to support this. Please use a more recent kernel or\n" "a version of SBCL without threading support.\n"); } +#endif if(! isnptl()) { lose("This version of SBCL only works correctly with the NPTL threading\n" "library. Please use a newer glibc, use an older SBCL, or stop using\n" @@ -208,6 +237,10 @@ os_init(char *argv[], char *envp[]) fprintf(stderr, "WARNING: Couldn't re-execute SBCL with the proper personality flags (maybe /proc isn't mounted?). Trying to continue anyway.\n"); } } + /* Use SSE detector. Recent versions of Linux enable SSE support + * on SSE capable CPUs. */ + /* FIXME: Are there any old versions that does not support SSE? */ + fast_bzero_pointer = fast_bzero_detect; #endif } @@ -280,7 +313,14 @@ void os_protect(os_vm_address_t address, os_vm_size_t length, os_vm_prot_t prot) { if (mprotect(address, length, prot) == -1) { - perror("mprotect"); + if (errno == ENOMEM) { + lose("An mprotect call failed with ENOMEM. This probably means that the maximum amount\n" + "of separate memory mappings was exceeded. To fix the problem, either increase\n" + "the maximum with e.g. 'echo 262144 > /proc/sys/vm/max_map_count' or recompile\n" + "SBCL with a larger value for GENCGC-PAGE-SIZE in 'src/target/parms.lisp'."); + } else { + perror("mprotect"); + } } } @@ -348,7 +388,7 @@ sigsegv_handler(int signal, siginfo_t *info, void* void_context) #endif if (!handle_guard_page_triggered(context, addr)) #ifdef LISP_FEATURE_C_STACK_IS_CONTROL_STACK - arrange_return_to_lisp_function(context, SymbolFunction(MEMORY_FAULT_ERROR)); + lisp_memory_fault_error(context, addr); #else interrupt_handle_now(signal, info, context); #endif @@ -366,3 +406,18 @@ os_install_interrupt_handlers(void) sig_stop_for_gc_handler); #endif } + +char * +os_get_runtime_executable_path() +{ + char path[PATH_MAX + 1]; + int size; + + size = readlink("/proc/self/exe", path, sizeof(path)-1); + if (size < 0) + return NULL; + else + path[size] = '\0'; + + return copied_string(path); +}