summaryrefslogtreecommitdiff
path: root/m4
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2011-07-08 13:20:19 -0700
committerPaul Eggert <eggert@cs.ucla.edu>2011-07-08 13:20:19 -0700
commit2a84b02da8b20138fad7fafdea92d7c8f0564ee0 (patch)
treeda64c1fd303aa85b53ad485779b05fbdd2685a28 /m4
parent1692ae2dd5ff8f6f1fc6f6f62b9a44ab7e615615 (diff)
downloademacs-2a84b02da8b20138fad7fafdea92d7c8f0564ee0.tar.gz
Simplify Emacs part of pthread_sigmask support.
* Makefile.in (GNULIB_TOOL_FLAGS): Do not avoid sigprocmask. * configure.in (AC_TYPE_UID_T): New dummy macro. Configure gnulib after adjusting LIBS, so that gnulib can assume the libraries in LIBS. * lib/pthread_sigmask.c, lib/sigprocmask.c, m4/signalblocking.m4: New files, automatically imported from gnulib. * lib/gnulib.mk, m4/gl-comp.m4: Regenerate. * src/Makefile.in (LIB_PTHREAD_SIGMASK): New macro. (LIBES): Use it.
Diffstat (limited to 'm4')
-rw-r--r--m4/getopt.m483
-rw-r--r--m4/gl-comp.m425
-rw-r--r--m4/pthread_sigmask.m477
-rw-r--r--m4/signal_h.m43
-rw-r--r--m4/signalblocking.m425
5 files changed, 164 insertions, 49 deletions
diff --git a/m4/getopt.m4 b/m4/getopt.m4
index 4d8450ff907..7e49ddde9f6 100644
--- a/m4/getopt.m4
+++ b/m4/getopt.m4
@@ -1,4 +1,4 @@
-# getopt.m4 serial 35
+# getopt.m4 serial 38
dnl Copyright (C) 2002-2006, 2008-2011 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
@@ -89,15 +89,15 @@ AC_DEFUN([gl_GETOPT_CHECK_HEADERS],
AC_CACHE_CHECK([whether getopt is POSIX compatible],
[gl_cv_func_getopt_posix],
[
- dnl BSD getopt_long uses an incompatible method to reset
- dnl option processing. Existence of the variable, in and of
+ dnl BSD getopt_long uses an incompatible method to reset option
+ dnl processing. Existence of the optreset variable, in and of
dnl itself, is not a reason to replace getopt, but knowledge
dnl of the variable is needed to determine how to reset and
dnl whether a reset reparses the environment. Solaris
dnl supports neither optreset nor optind=0, but keeps no state
dnl that needs a reset beyond setting optind=1; detect Solaris
dnl by getopt_clip.
- AC_COMPILE_IFELSE(
+ AC_LINK_IFELSE(
[AC_LANG_PROGRAM(
[[#include <unistd.h>]],
[[int *p = &optreset; return optreset;]])],
@@ -121,22 +121,20 @@ int
main ()
{
{
- int argc = 0;
- char *argv[10];
+ static char program[] = "program";
+ static char a[] = "-a";
+ static char foo[] = "foo";
+ static char bar[] = "bar";
+ char *argv[] = { program, a, foo, bar, NULL };
int c;
- argv[argc++] = "program";
- argv[argc++] = "-a";
- argv[argc++] = "foo";
- argv[argc++] = "bar";
- argv[argc] = NULL;
optind = OPTIND_MIN;
opterr = 0;
- c = getopt (argc, argv, "ab");
+ c = getopt (4, argv, "ab");
if (!(c == 'a'))
return 1;
- c = getopt (argc, argv, "ab");
+ c = getopt (4, argv, "ab");
if (!(c == -1))
return 2;
if (!(optind == 2))
@@ -144,22 +142,20 @@ main ()
}
/* Some internal state exists at this point. */
{
- int argc = 0;
- char *argv[10];
+ static char program[] = "program";
+ static char donald[] = "donald";
+ static char p[] = "-p";
+ static char billy[] = "billy";
+ static char duck[] = "duck";
+ static char a[] = "-a";
+ static char bar[] = "bar";
+ char *argv[] = { program, donald, p, billy, duck, a, bar, NULL };
int c;
- argv[argc++] = "program";
- argv[argc++] = "donald";
- argv[argc++] = "-p";
- argv[argc++] = "billy";
- argv[argc++] = "duck";
- argv[argc++] = "-a";
- argv[argc++] = "bar";
- argv[argc] = NULL;
optind = OPTIND_MIN;
opterr = 0;
- c = getopt (argc, argv, "+abp:q:");
+ c = getopt (7, argv, "+abp:q:");
if (!(c == -1))
return 4;
if (!(strcmp (argv[0], "program") == 0))
@@ -181,7 +177,9 @@ main ()
}
/* Detect MacOS 10.5, AIX 7.1 bug. */
{
- char *argv[3] = { "program", "-ab", NULL };
+ static char program[] = "program";
+ static char ab[] = "-ab";
+ char *argv[3] = { program, ab, NULL };
optind = OPTIND_MIN;
opterr = 0;
if (getopt (2, argv, "ab:") != 'a')
@@ -239,19 +237,22 @@ dnl is ambiguous with environment values that contain newlines.
and fails on MacOS X 10.5, AIX 5.2, HP-UX 11, IRIX 6.5,
OSF/1 5.1, Solaris 10. */
{
- char *myargv[3];
- myargv[0] = "conftest";
- myargv[1] = "-+";
- myargv[2] = 0;
+ static char conftest[] = "conftest";
+ static char plus[] = "-+";
+ char *argv[3] = { conftest, plus, NULL };
opterr = 0;
- if (getopt (2, myargv, "+a") != '?')
+ if (getopt (2, argv, "+a") != '?')
result |= 1;
}
/* This code succeeds on glibc 2.8, mingw,
and fails on MacOS X 10.5, OpenBSD 4.0, AIX 5.2, HP-UX 11,
IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x. */
{
- char *argv[] = { "program", "-p", "foo", "bar", NULL };
+ static char program[] = "program";
+ static char p[] = "-p";
+ static char foo[] = "foo";
+ static char bar[] = "bar";
+ char *argv[] = { program, p, foo, bar, NULL };
optind = 1;
if (getopt (4, argv, "p::") != 'p')
@@ -265,7 +266,10 @@ dnl is ambiguous with environment values that contain newlines.
}
/* This code succeeds on glibc 2.8 and fails on Cygwin 1.7.0. */
{
- char *argv[] = { "program", "foo", "-p", NULL };
+ static char program[] = "program";
+ static char foo[] = "foo";
+ static char p[] = "-p";
+ char *argv[] = { program, foo, p, NULL };
optind = 0;
if (getopt (3, argv, "-p") != 1)
result |= 16;
@@ -274,13 +278,26 @@ dnl is ambiguous with environment values that contain newlines.
}
/* This code fails on glibc 2.11. */
{
- char *argv[] = { "program", "-b", "-a", NULL };
+ static char program[] = "program";
+ static char b[] = "-b";
+ static char a[] = "-a";
+ char *argv[] = { program, b, a, NULL };
optind = opterr = 0;
if (getopt (3, argv, "+:a:b") != 'b')
result |= 64;
else if (getopt (3, argv, "+:a:b") != ':')
result |= 64;
}
+ /* This code dumps core on glibc 2.14. */
+ {
+ static char program[] = "program";
+ static char w[] = "-W";
+ static char dummy[] = "dummy";
+ char *argv[] = { program, w, dummy, NULL };
+ optind = opterr = 1;
+ if (getopt (3, argv, "W;") != 'W')
+ result |= 128;
+ }
return result;
]])],
[gl_cv_func_getopt_gnu=yes],
diff --git a/m4/gl-comp.m4 b/m4/gl-comp.m4
index 004c01a10a0..6c94e373871 100644
--- a/m4/gl-comp.m4
+++ b/m4/gl-comp.m4
@@ -55,6 +55,7 @@ AC_DEFUN([gl_EARLY],
# Code from module pthread_sigmask:
# Code from module readlink:
# Code from module signal:
+ # Code from module sigprocmask:
# Code from module socklen:
# Code from module ssize_t:
# Code from module stat:
@@ -142,7 +143,10 @@ if test $REPLACE_MKTIME = 1; then
fi
gl_TIME_MODULE_INDICATOR([mktime])
gl_MULTIARCH
-gl_PTHREAD_SIGMASK
+gl_FUNC_PTHREAD_SIGMASK
+if test $HAVE_PTHREAD_SIGMASK = 0 || test $REPLACE_PTHREAD_SIGMASK = 1; then
+ AC_LIBOBJ([pthread_sigmask])
+fi
gl_SIGNAL_MODULE_INDICATOR([pthread_sigmask])
gl_FUNC_READLINK
if test $HAVE_READLINK = 0 || test $REPLACE_READLINK = 1; then
@@ -184,6 +188,7 @@ AC_REQUIRE([AC_C_INLINE])
gl_UNISTD_H
gl_gnulib_enabled_dosname=false
gl_gnulib_enabled_be453cec5eecf5731a274f2de7f2db36=false
+ gl_gnulib_enabled_sigprocmask=false
gl_gnulib_enabled_stat=false
gl_gnulib_enabled_strtoull=false
gl_gnulib_enabled_verify=false
@@ -201,6 +206,18 @@ AC_SUBST([LTLIBINTL])
gl_gnulib_enabled_be453cec5eecf5731a274f2de7f2db36=true
fi
}
+ func_gl_gnulib_m4code_sigprocmask ()
+ {
+ if ! $gl_gnulib_enabled_sigprocmask; then
+gl_SIGNALBLOCKING
+if test $HAVE_POSIX_SIGNALBLOCKING = 0; then
+ AC_LIBOBJ([sigprocmask])
+ gl_PREREQ_SIGPROCMASK
+fi
+gl_SIGNAL_MODULE_INDICATOR([sigprocmask])
+ gl_gnulib_enabled_sigprocmask=true
+ fi
+ }
func_gl_gnulib_m4code_stat ()
{
if ! $gl_gnulib_enabled_stat; then
@@ -246,7 +263,7 @@ gl_STDLIB_MODULE_INDICATOR([strtoull])
if test $REPLACE_LSTAT = 1; then
func_gl_gnulib_m4code_stat
fi
- if test $REPLACE_PTHREAD_SIGMASK = 1; then
+ if test $HAVE_PTHREAD_SIGMASK = 0 || test $REPLACE_PTHREAD_SIGMASK = 1; then
func_gl_gnulib_m4code_sigprocmask
fi
if test $HAVE_READLINK = 0 || test $REPLACE_READLINK = 1; then
@@ -261,6 +278,7 @@ gl_STDLIB_MODULE_INDICATOR([strtoull])
m4_pattern_allow([^gl_GNULIB_ENABLED_])
AM_CONDITIONAL([gl_GNULIB_ENABLED_dosname], [$gl_gnulib_enabled_dosname])
AM_CONDITIONAL([gl_GNULIB_ENABLED_be453cec5eecf5731a274f2de7f2db36], [$gl_gnulib_enabled_be453cec5eecf5731a274f2de7f2db36])
+ AM_CONDITIONAL([gl_GNULIB_ENABLED_sigprocmask], [$gl_gnulib_enabled_sigprocmask])
AM_CONDITIONAL([gl_GNULIB_ENABLED_stat], [$gl_gnulib_enabled_stat])
AM_CONDITIONAL([gl_GNULIB_ENABLED_strtoull], [$gl_gnulib_enabled_strtoull])
AM_CONDITIONAL([gl_GNULIB_ENABLED_verify], [$gl_gnulib_enabled_verify])
@@ -434,6 +452,7 @@ AC_DEFUN([gl_FILE_LIST], [
lib/md5.h
lib/mktime-internal.h
lib/mktime.c
+ lib/pthread_sigmask.c
lib/readlink.c
lib/sha1.c
lib/sha1.h
@@ -442,6 +461,7 @@ AC_DEFUN([gl_FILE_LIST], [
lib/sha512.c
lib/sha512.h
lib/signal.in.h
+ lib/sigprocmask.c
lib/stat.c
lib/stdarg.in.h
lib/stdbool.in.h
@@ -485,6 +505,7 @@ AC_DEFUN([gl_FILE_LIST], [
m4/sha256.m4
m4/sha512.m4
m4/signal_h.m4
+ m4/signalblocking.m4
m4/socklen.m4
m4/ssize_t.m4
m4/st_dm_mode.m4
diff --git a/m4/pthread_sigmask.m4 b/m4/pthread_sigmask.m4
index d25e2cc3e70..dfa0f660a75 100644
--- a/m4/pthread_sigmask.m4
+++ b/m4/pthread_sigmask.m4
@@ -1,26 +1,77 @@
-# pthread_sigmask.m4 serial 2
+# pthread_sigmask.m4 serial 7
dnl Copyright (C) 2011 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved.
-AC_DEFUN([gl_PTHREAD_SIGMASK],
+AC_DEFUN([gl_FUNC_PTHREAD_SIGMASK],
[
+ AC_CHECK_FUNCS_ONCE([pthread_sigmask])
+ LIB_PTHREAD_SIGMASK=
m4_ifdef([gl_THREADLIB], [
AC_REQUIRE([gl_THREADLIB])
if test "$gl_threads_api" = posix; then
- gl_save_LIBS="$LIBS"
- LIBS="$LIBS $LIBMULTITHREAD"
- AC_CHECK_FUNCS([pthread_sigmask])
- LIBS="$gl_save_LIBS"
+ if test $ac_cv_func_pthread_sigmask = yes; then
+ dnl pthread_sigmask is available without -lpthread.
+ :
+ else
+ if test -n "$LIBMULTITHREAD"; then
+ AC_CACHE_CHECK([for pthread_sigmask in $LIBMULTITHREAD],
+ [gl_cv_func_pthread_sigmask_in_LIBMULTITHREAD],
+ [gl_save_LIBS="$LIBS"
+ LIBS="$LIBS $LIBMULTITHREAD"
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <pthread.h>
+ #include <signal.h>
+ ]],
+ [[return pthread_sigmask (0, (sigset_t *) 0, (sigset_t *) 0);]])
+ ],
+ [gl_cv_func_pthread_sigmask_in_LIBMULTITHREAD=yes],
+ [gl_cv_func_pthread_sigmask_in_LIBMULTITHREAD=no])
+ LIBS="$gl_save_LIBS"
+ ])
+ if test $gl_cv_func_pthread_sigmask_in_LIBMULTITHREAD = yes; then
+ dnl pthread_sigmask is available with -lpthread.
+ LIB_PTHREAD_SIGMASK="$LIBMULTITHREAD"
+ else
+ dnl pthread_sigmask is not available at all.
+ HAVE_PTHREAD_SIGMASK=0
+ fi
+ else
+ dnl pthread_sigmask is not available at all.
+ HAVE_PTHREAD_SIGMASK=0
+ fi
+ fi
else
- ac_cv_func_pthread_sigmask=no
+ dnl pthread_sigmask may exist but does not interoperate with the chosen
+ dnl multithreading facility.
+ dnl If "$gl_threads_api" = pth, we could use the function pth_sigmask,
+ dnl but it is equivalent to sigprocmask, so we choose to emulate
+ dnl pthread_sigmask with sigprocmask also in this case. This yields fewer
+ dnl link dependencies.
+ if test $ac_cv_func_pthread_sigmask = yes; then
+ REPLACE_PTHREAD_SIGMASK=1
+ else
+ HAVE_PTHREAD_SIGMASK=0
+ fi
+ fi
+ ] ,[
+ dnl gl_THREADLIB is not in use. Assume the application wants
+ dnl POSIX semantics.
+ if test $ac_cv_func_pthread_sigmask != yes; then
+ gl_save_LIBS=$LIBS
+ AC_SEARCH_LIBS([pthread_sigmask], [pthread c_r])
+ LIBS=$gl_save_LIBS
+ if test "$ac_cv_search_pthread_sigmask" = no; then
+ HAVE_PTHREAD_SIGMASK=0
+ elif test "$ac_cv_search_pthread_sigmask" != 'none required'; then
+ LIB_PTHREAD_SIGMASK=$ac_cv_search_pthread_sigmask
+ fi
fi
- ], [
- AC_CHECK_FUNCS_ONCE([pthread_sigmask])
])
-
- if test $ac_cv_func_pthread_sigmask = no; then
- REPLACE_PTHREAD_SIGMASK=1
- fi
+ AC_SUBST([LIB_PTHREAD_SIGMASK])
+ dnl We don't need a variable LTLIB_PTHREAD_SIGMASK, because when
+ dnl "$gl_threads_api" = posix, $LTLIBMULTITHREAD and $LIBMULTITHREAD are the
+ dnl same: either both empty or both "-lpthread".
])
diff --git a/m4/signal_h.m4 b/m4/signal_h.m4
index 53972fba54f..b9536fb0e3c 100644
--- a/m4/signal_h.m4
+++ b/m4/signal_h.m4
@@ -1,4 +1,4 @@
-# signal_h.m4 serial 14
+# signal_h.m4 serial 16
dnl Copyright (C) 2007-2011 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
@@ -64,6 +64,7 @@ AC_DEFUN([gl_SIGNAL_H_DEFAULTS],
GNULIB_SIGACTION=0; AC_SUBST([GNULIB_SIGACTION])
dnl Assume proper GNU behavior unless another module says otherwise.
HAVE_POSIX_SIGNALBLOCKING=1; AC_SUBST([HAVE_POSIX_SIGNALBLOCKING])
+ HAVE_PTHREAD_SIGMASK=1; AC_SUBST([HAVE_PTHREAD_SIGMASK])
HAVE_SIGSET_T=1; AC_SUBST([HAVE_SIGSET_T])
HAVE_SIGINFO_T=1; AC_SUBST([HAVE_SIGINFO_T])
HAVE_SIGACTION=1; AC_SUBST([HAVE_SIGACTION])
diff --git a/m4/signalblocking.m4 b/m4/signalblocking.m4
new file mode 100644
index 00000000000..15b74253ba6
--- /dev/null
+++ b/m4/signalblocking.m4
@@ -0,0 +1,25 @@
+# signalblocking.m4 serial 12
+dnl Copyright (C) 2001-2002, 2006-2011 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Determine available signal blocking primitives. Three different APIs exist:
+# 1) POSIX: sigemptyset, sigaddset, sigprocmask
+# 2) SYSV: sighold, sigrelse
+# 3) BSD: sigblock, sigsetmask
+# For simplicity, here we check only for the POSIX signal blocking.
+AC_DEFUN([gl_SIGNALBLOCKING],
+[
+ AC_REQUIRE([gl_SIGNAL_H_DEFAULTS])
+ AC_REQUIRE([gl_CHECK_TYPE_SIGSET_T])
+ if test $gl_cv_type_sigset_t = yes; then
+ AC_CHECK_FUNC([sigprocmask], [gl_cv_func_sigprocmask=1])
+ fi
+ if test -z "$gl_cv_func_sigprocmask"; then
+ HAVE_POSIX_SIGNALBLOCKING=0
+ fi
+])
+
+# Prerequisites of lib/sigprocmask.c.
+AC_DEFUN([gl_PREREQ_SIGPROCMASK], [:])