X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Flinux-os.c;h=fbc888e5579a9806d7c13bbeb34fe5d15df29e15;hb=60ce532301c8f4b7ed289d049717ee16639bc4d4;hp=d0aa95a478f21036006707708b1db12758783b9e;hpb=ff6f7c4d82e5780cced4900561eaae2af0a24d06;p=sbcl.git diff --git a/src/runtime/linux-os.c b/src/runtime/linux-os.c index d0aa95a..fbc888e 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) #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) int *futex=0; #endif struct utsname name; @@ -134,7 +161,7 @@ os_init(char *argv[], char *envp[]) p=strchr(p,'.')+1; patch_version = atoi(p); if (major_version<2) { - lose("linux kernel version too old: major version=%d (can't run in version < 2.0.0)", + lose("linux kernel version too old: major version=%d (can't run in version < 2.0.0)\n", major_version); } if (!(major_version>2 || minor_version >= 4)) { @@ -144,13 +171,18 @@ os_init(char *argv[], char *envp[]) #endif } #ifdef LISP_FEATURE_SB_THREAD +#if !defined(LISP_FEATURE_SB_LUTEX) futex_wait(futex,-1); if(errno==ENOSYS) { - lose("This version of SBCL is compiled with threading support, but your kernel is too old to support this.\n\ -Please use a more recent kernel or a version of SBCL without threading support.\n"); + 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 library. Please use a newer glibc, use an older SBCL, or stop using LD_ASSUME_KERNEL"); + 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" + "LD_ASSUME_KERNEL\n"); } #endif os_vm_page_size = getpagesize(); @@ -205,6 +237,10 @@ Please use a more recent kernel or a version of SBCL without threading support.\ 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 } @@ -267,7 +303,7 @@ os_map(int fd, int offset, os_vm_address_t addr, os_vm_size_t len) fd, (off_t) offset); if (actual == MAP_FAILED || (addr && (addr != actual))) { perror("mmap"); - lose("unexpected mmap(..) failure"); + lose("unexpected mmap(..) failure\n"); } return actual; @@ -277,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"); + } } } @@ -363,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); +}