From: Juho Snellman Date: Wed, 31 Aug 2005 17:17:38 +0000 (+0000) Subject: 0.9.4.21: X-Git-Url: http://repo.macrolet.net/gitweb/?a=commitdiff_plain;h=cd968d3af54bf2c75ac8e838e3216500d23d28e7;p=sbcl.git 0.9.4.21: Refuse to start a threaded SBCL on a non-NPTL system, since falling back to the non-threaded mode has been causing mysterious problems after the pthread merge. Patch by Peter Van Eynde (sbcl-devel "sbcl with sb-threads not compatible with 2.4 kernel", 2005-08-12). --- diff --git a/NEWS b/NEWS index c6a1956..882bbad 100644 --- a/NEWS +++ b/NEWS @@ -7,6 +7,8 @@ changes in sbcl-0.9.5 relative to sbcl-0.9.4: iso-8859-8, iso-8859-9, iso-8859-10, iso-8859-11, iso-8859-13, iso-8859-14, cp1250, cp1251, cp1252, cp1253, cp1254, cp1255,cp1256, cp1257, cp1258 (contributed by Ivan Boldyrev) + * incompatible change: a threaded SBCL will no longer revert to + non-threaded mode on non-NPTL systems, but refuse to start entirely. * bug fix: interrupts are disabled until startup is complete; no more sigsegvs when receiving a signal to soon * optimization: Faster 32-bit SB-ROTATE-BYTE:ROTATE-BYTE on non-x86/ppc diff --git a/src/runtime/linux-os.c b/src/runtime/linux-os.c index a283abb..8fe0ca7 100644 --- a/src/runtime/linux-os.c +++ b/src/runtime/linux-os.c @@ -95,6 +95,21 @@ futex_wake(int *lock_word, int n) int linux_sparc_siginfo_bug = 0; int linux_no_threads_p = 0; +#ifdef LISP_FEATURE_SB_THREAD +int isnptl (void) +{ + size_t n = confstr (_CS_GNU_LIBPTHREAD_VERSION, NULL, 0); + if (n > 0) + { + char *buf = alloca (n); + confstr (_CS_GNU_LIBPTHREAD_VERSION, buf, n); + if (strstr (buf, "NPTL")) + return 1; + } + return 0; +} +#endif + void os_init(char *argv[], char *envp[]) { @@ -124,9 +139,13 @@ os_init(char *argv[], char *envp[]) } #ifdef LISP_FEATURE_SB_THREAD futex_wait(futex,-1); - if(errno==ENOSYS) linux_no_threads_p = 1; - if(linux_no_threads_p) - fprintf(stderr,"Linux with NPTL support (e.g. kernel 2.6 or newer) required for \nthread-enabled SBCL. Disabling thread support.\n\n"); + 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"); + } + if(! isnptl()) { + lose("This version of sbcl only works correctly with the NPTL threading library. Please use a newer glibc, older sbcl or stop using LD_ASSUME_KERNEL"); + } #endif os_vm_page_size = getpagesize(); @@ -143,14 +162,18 @@ os_init(char *argv[], char *envp[]) /* 0x40000 aka. ADDR_NO_RANDOMIZE */ if (!(pers & 0x40000)) { if (personality(pers | 0x40000) != -1) { - char runtime[PATH_MAX+1]; - /* Use /proc/self/exe instead of trying to figure out the - * executable path from PATH and argv[0], since that's - * unreliable. - */ - if (readlink("/proc/self/exe", runtime, PATH_MAX) != -1) { - execve(runtime, argv, envp); - } + /* Use /proc/self/exe instead of trying to figure out the + * executable path from PATH and argv[0], since that's + * unreliable. We follow the symlink instead of executing + * the file directly to avoid top from displaying the + * name of the process as "exe". + */ + char runtime[PATH_MAX+1]; + int i = readlink("/proc/self/exe", runtime, PATH_MAX) != -1; + if (i != -1) { + runtime[i] = '\0'; + execve(runtime, argv, envp); + } } /* Either changing the personality or execve() failed. Either * way we might as well continue, and hope that the random diff --git a/version.lisp-expr b/version.lisp-expr index 782d259..7d4368e 100644 --- a/version.lisp-expr +++ b/version.lisp-expr @@ -17,4 +17,4 @@ ;;; checkins which aren't released. (And occasionally for internal ;;; versions, especially for internal versions off the main CVS ;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".) -"0.9.4.20" +"0.9.4.21"