Don't substitute sigprocmask for pthread_sigmask.

sigprocmask isn't portable in a multithreaded process.
* configure.ac (gl_THREADLIB): Remove dummy.
Merge from gnulib, incorporating:
2014-05-28 pthread_sigmask, timer-time: use gl_THREADLIB only if needed
* m4/pthread_sigmask.m4, m4/timer_time.m4: Update from gnulib.
* src/Makefile.in (LIB_PTHREAD_SIGMASK): Remove; all uses removed.

Fixes: debbugs:17561
This commit is contained in:
Paul Eggert 2014-05-29 08:05:06 -07:00
parent 0bbb27fc3f
commit 035159ed54
6 changed files with 83 additions and 63 deletions

View file

@ -1,3 +1,12 @@
2014-05-29 Paul Eggert <eggert@cs.ucla.edu>
Don't substitute sigprocmask for pthread_sigmask (Bug#17561).
sigprocmask isn't portable in a multithreaded process.
* configure.ac (gl_THREADLIB): Remove dummy.
Merge from gnulib, incorporating:
2014-05-28 pthread_sigmask, timer-time: use gl_THREADLIB only if needed
* m4/pthread_sigmask.m4, m4/timer_time.m4: Update from gnulib.
2014-05-29 Glenn Morris <rgm@gnu.org>
* configure.ac: Explicitly drop some ancient Solaris versions.

View file

@ -704,8 +704,6 @@ AC_DEFUN([gl_CRYPTO_CHECK])
# Avoid gnulib's tests for HAVE_WORKING_O_NOATIME and HAVE_WORKING_O_NOFOLLOW,
# as we don't use them.
AC_DEFUN([gl_FCNTL_O_FLAGS])
# Avoid gnulib's threadlib module, as we do threads our own way.
AC_DEFUN([gl_THREADLIB])
# Initialize gnulib right after choosing the compiler.
dnl Amongst other things, this sets AR and ARFLAGS.

View file

@ -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)

View file

@ -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
])

View file

@ -1,3 +1,8 @@
2014-05-29 Paul Eggert <eggert@cs.ucla.edu>
Don't substitute sigprocmask for pthread_sigmask (Bug#17561).
* Makefile.in (LIB_PTHREAD_SIGMASK): Remove; all uses removed.
2014-05-29 Eli Zaretskii <eliz@gnu.org>
* buffer.c (init_buffer): Accept an argument 'initialized'.

View file

@ -125,7 +125,7 @@ LIBS_SYSTEM=@LIBS_SYSTEM@
## -lm, or empty.
LIB_MATH=@LIB_MATH@
## -lpthreads, or empty.
## -lpthread, or empty.
LIB_PTHREAD=@LIB_PTHREAD@
LIBIMAGE=@LIBTIFF@ @LIBJPEG@ @LIBPNG@ @LIBGIF@ @LIBXPM@
@ -293,8 +293,6 @@ LIBSELINUX_LIBS = @LIBSELINUX_LIBS@
LIBGNUTLS_LIBS = @LIBGNUTLS_LIBS@
LIBGNUTLS_CFLAGS = @LIBGNUTLS_CFLAGS@
LIB_PTHREAD_SIGMASK = @LIB_PTHREAD_SIGMASK@
INTERVALS_H = dispextern.h intervals.h composite.h
GETLOADAVG_LIBS = @GETLOADAVG_LIBS@
@ -413,7 +411,7 @@ LIBES = $(LIBS) $(W32_LIBS) $(LIBS_GNUSTEP) $(LIBX_BASE) $(LIBIMAGE) \
$(LIBXML2_LIBS) $(LIBGPM) $(LIBRESOLV) $(LIBS_SYSTEM) \
$(LIBS_TERMCAP) $(GETLOADAVG_LIBS) $(SETTINGS_LIBS) $(LIBSELINUX_LIBS) \
$(FREETYPE_LIBS) $(FONTCONFIG_LIBS) $(LIBOTF_LIBS) $(M17N_FLT_LIBS) \
$(LIBGNUTLS_LIBS) $(LIB_PTHREAD) $(LIB_PTHREAD_SIGMASK) \
$(LIBGNUTLS_LIBS) $(LIB_PTHREAD) \
$(GFILENOTIFY_LIBS) $(LIB_MATH) $(LIBZ)
all: emacs$(EXEEXT) $(OTHER_FILES)