Without this fix, Emacs would sometimes call sigprocmask instead of pthread_sigmask, which is a no-no in multithreaded applications. Problem reported by Jorgen Schaefer in <http://bugs.gnu.org/17561>. * m4/pthread_sigmask.m4 (gl_FUNC_PTHREAD_SIGMASK): Suppress check for pthread_sigmask working without -lpthread if the application always links with -lpthread. Do not link with $LIBMULTITHREAD if gl_THREADLIB is not defined. * m4/timer_time.m4 (gl_TIMER_TIME): Require gl_THREADLIB only if it is defined. Do not append $LIBMULTITHREAD to LIB_TIMER_TIME if gl_THREADLIB is not defined. --- ChangeLog | 14 +++++++++ m4/pthread_sigmask.m4 | 85 +++++++++++++++++++++++++++------------------------ m4/timer_time.m4 | 39 ++++++++++++----------- 3 files changed, 81 insertions(+), 57 deletions(-)
diff --git a/ChangeLog b/ChangeLog index d76591a..e95bb22 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2014-05-28 Paul Eggert <egg...@cs.ucla.edu> + + pthread_sigmask, timer-time: use gl_THREADLIB only if needed + Without this fix, Emacs would sometimes call sigprocmask instead + of pthread_sigmask, which is a no-no in multithreaded applications. + Problem reported by Jorgen Schaefer in <http://bugs.gnu.org/17561>. + * m4/pthread_sigmask.m4 (gl_FUNC_PTHREAD_SIGMASK): + Suppress check for pthread_sigmask working without -lpthread if + the application always links with -lpthread. Do not link with + $LIBMULTITHREAD if gl_THREADLIB is not defined. + * m4/timer_time.m4 (gl_TIMER_TIME): + Require gl_THREADLIB only if it is defined. Do not append + $LIBMULTITHREAD to LIB_TIMER_TIME if gl_THREADLIB is not defined. + 2014-05-27 Sylvain Beucler <b...@beuc.net>. gnulib-tool: wget translations using --no-verbose rather than --quiet diff --git a/m4/pthread_sigmask.m4 b/m4/pthread_sigmask.m4 index 4ba0732..2b3347f 100644 --- a/m4/pthread_sigmask.m4 +++ b/m4/pthread_sigmask.m4 @@ -1,4 +1,4 @@ -# pthread_sigmask.m4 serial 13 +# pthread_sigmask.m4 serial 14 dnl Copyright (C) 2011-2014 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -97,39 +97,43 @@ AC_DEFUN([gl_FUNC_PTHREAD_SIGMASK], dnl with -lpthread, the pthread_sigmask() function always returns 0 and has dnl no effect. if test -z "$LIB_PTHREAD_SIGMASK"; then - AC_CACHE_CHECK([whether pthread_sigmask works without -lpthread], - [gl_cv_func_pthread_sigmask_in_libc_works], - [ - AC_RUN_IFELSE( - [AC_LANG_SOURCE([[ -#include <pthread.h> -#include <signal.h> -#include <stddef.h> -int main () -{ - sigset_t set; - sigemptyset (&set); - return pthread_sigmask (1729, &set, NULL) != 0; -}]])], - [gl_cv_func_pthread_sigmask_in_libc_works=no], - [gl_cv_func_pthread_sigmask_in_libc_works=yes], - [ -changequote(,)dnl - case "$host_os" in - freebsd* | hpux* | solaris | solaris2.[2-9]*) - gl_cv_func_pthread_sigmask_in_libc_works="guessing no";; - *) - gl_cv_func_pthread_sigmask_in_libc_works="guessing yes";; - esac -changequote([,])dnl - ]) - ]) - case "$gl_cv_func_pthread_sigmask_in_libc_works" in - *no) - REPLACE_PTHREAD_SIGMASK=1 - AC_DEFINE([PTHREAD_SIGMASK_INEFFECTIVE], [1], - [Define to 1 if pthread_sigmask() may returns 0 and have no effect.]) - ;; + case " $LIBS " in + *' -lpthread '*) ;; + *) + AC_CACHE_CHECK([whether pthread_sigmask works without -lpthread], + [gl_cv_func_pthread_sigmask_in_libc_works], + [ + AC_RUN_IFELSE( + [AC_LANG_SOURCE([[ + #include <pthread.h> + #include <signal.h> + #include <stddef.h> + int main () + { + sigset_t set; + sigemptyset (&set); + return pthread_sigmask (1729, &set, NULL) != 0; + }]])], + [gl_cv_func_pthread_sigmask_in_libc_works=no], + [gl_cv_func_pthread_sigmask_in_libc_works=yes], + [ + changequote(,)dnl + case "$host_os" in + freebsd* | hpux* | solaris | solaris2.[2-9]*) + gl_cv_func_pthread_sigmask_in_libc_works="guessing no";; + *) + gl_cv_func_pthread_sigmask_in_libc_works="guessing yes";; + esac + changequote([,])dnl + ]) + ]) + case "$gl_cv_func_pthread_sigmask_in_libc_works" in + *no) + REPLACE_PTHREAD_SIGMASK=1 + AC_DEFINE([PTHREAD_SIGMASK_INEFFECTIVE], [1], + [Define to 1 if pthread_sigmask may return 0 and have no effect.]) + ;; + esac;; esac fi @@ -184,11 +188,12 @@ int main () *) gl_cv_func_pthread_sigmask_unblock_works="guessing yes";; esac - dnl Here we link against $LIBMULTITHREAD, not only $LIB_PTHREAD_SIGMASK, - dnl otherwise we get a false positive on those platforms where - dnl $gl_cv_func_pthread_sigmask_in_libc_works is "no". - gl_save_LIBS="$LIBS" - LIBS="$LIBS $LIBMULTITHREAD" + m4_ifdef([gl_][THREADLIB], + [dnl Link against $LIBMULTITHREAD, not only $LIB_PTHREAD_SIGMASK. + dnl Otherwise we get a false positive on those platforms where + dnl $gl_cv_func_pthread_sigmask_in_libc_works is "no". + gl_save_LIBS=$LIBS + LIBS="$LIBS $LIBMULTITHREAD"]) AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include <pthread.h> @@ -227,7 +232,7 @@ int main () [:], [gl_cv_func_pthread_sigmask_unblock_works=no], [:]) - LIBS="$gl_save_LIBS" + m4_ifdef([gl_][THREADLIB], [LIBS=$gl_save_LIBS]) ]) case "$gl_cv_func_pthread_sigmask_unblock_works" in *no) diff --git a/m4/timer_time.m4 b/m4/timer_time.m4 index 8e2c921..578ebe0 100644 --- a/m4/timer_time.m4 +++ b/m4/timer_time.m4 @@ -1,4 +1,4 @@ -# timer_time.m4 serial 2 +# timer_time.m4 serial 3 dnl Copyright (C) 2011-2014 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -11,7 +11,12 @@ AC_DEFUN([gl_TIMER_TIME], dnl Based on clock_time.m4. See details there. AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) - AC_REQUIRE([gl_THREADLIB]) + + dnl Test whether the gnulib module 'threadlib' is in use. + dnl Some packages like Emacs use --avoid=threadlib. + dnl Write the symbol in such a way that it does not cause 'aclocal' to pick + dnl the threadlib.m4 file that is installed in $PREFIX/share/aclocal/. + m4_ifdef([gl_][THREADLIB], [AC_REQUIRE([gl_][THREADLIB])]) LIB_TIMER_TIME= AC_SUBST([LIB_TIMER_TIME]) @@ -19,21 +24,21 @@ AC_DEFUN([gl_TIMER_TIME], AC_SEARCH_LIBS([timer_settime], [rt posix4], [test "$ac_cv_search_timer_settime" = "none required" || LIB_TIMER_TIME=$ac_cv_search_timer_settime]) - dnl GLIBC uses threads to emulate posix timers when kernel support - dnl is not available (like Linux < 2.6 or when used with kFreeBSD) - dnl Now the pthread lib is linked automatically in the normal case, - dnl but when linking statically, it needs to be explicitly specified. - AC_EGREP_CPP([Thread], - [ -#include <features.h> -#ifdef __GNU_LIBRARY__ - #if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2) || (__GLIBC__ > 2)) \ - && !(__UCLIBC__ && __HAS_NO_THREADS__) - Thread emulation available - #endif -#endif - ], - [LIB_TIMER_TIME="$LIB_TIMER_TIME $LIBMULTITHREAD"]) + m4_ifdef([gl_][THREADLIB], + [dnl GLIBC uses threads to emulate posix timers when kernel support + dnl is not available (like Linux < 2.6 or when used with kFreeBSD) + dnl Now the pthread lib is linked automatically in the normal case, + dnl but when linking statically, it needs to be explicitly specified. + AC_EGREP_CPP([Thread], + [#include <features.h> + #ifdef __GNU_LIBRARY__ + #if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2) || (__GLIBC__ > 2)) \ + && !(__UCLIBC__ && __HAS_NO_THREADS__) + Thread emulation available + #endif + #endif + ], + [LIB_TIMER_TIME="$LIB_TIMER_TIME $LIBMULTITHREAD"])]) AC_CHECK_FUNCS([timer_settime]) LIBS=$gl_saved_libs ]) -- 1.9.3