GNU bug report logs - #9010
sigprocmask -> pthread_sigmask for Emacs

Previous Next

Package: emacs;

Reported by: Paul Eggert <eggert <at> cs.ucla.edu>

Date: Wed, 6 Jul 2011 18:12:01 UTC

Severity: normal

Done: Chong Yidong <cyd <at> stupidchicken.com>

Bug is archived. No further changes may be made.

To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 9010 in the body.
You can then email your comments to 9010 AT debbugs.gnu.org in the normal way.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to owner <at> debbugs.gnu.org, bug-gnu-emacs <at> gnu.org:
bug#9010; Package emacs. (Wed, 06 Jul 2011 18:12:01 GMT) Full text and rfc822 format available.

Acknowledgement sent to Paul Eggert <eggert <at> cs.ucla.edu>:
New bug report received and forwarded. Copy sent to bug-gnu-emacs <at> gnu.org. (Wed, 06 Jul 2011 18:12:02 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: Paul Eggert <eggert <at> cs.ucla.edu>
To: bug-gnu-emacs <at> gnu.org
Cc: Eli Zaretskii <eliz <at> gnu.org>
Subject: sigprocmask -> pthread_sigmask for Emacs
Date: Wed, 06 Jul 2011 11:11:08 -0700
Currently Emacs uses sigprocmask to alter signal masks, but
sigprocmask is portable only for single-threaded applications, and
Emacs can be multithreaded when it uses GTK (and is likely to
become more multithreaded in the future).  I've seen bug reports
about this for other apps, in which misuse of sigprocmask (where
pthread_sigmask should be used) causes segfaults and the like.  I
haven't reproduced the problem with GNU Emacs but any such bugs
would quite possibly be random crashes that don't seem to be
related to sigprocmask.

To address this issue I plan to install the following patches, after
some more testing.  The first patch is the gnulib part (almost all
automatically-generated); the second patch is the patch to Emacs
proper.  The gnulib part now generates a substitute file lib/signal.h
for older hosts that don't have pthread_sigprocmask.

For the Windows port, I expect the simplest fix would be to add a
pthread_sigmask function that turns around and calls sigprocmask, but
maybe Windows has pthread_sigmask already?  And I don't expect the
Windows port will need to worry about the signal.h wrapper.

Add gnulib support for pthread_sigmask.
* Makefile.in (GNULIB_MODULES): Add pthread_sigmask.
(GNULIB_TOOL_FLAGS): Avoid sigprocmask.  Emacs does its own
implementation of 'sigprocmask' on Windows, and it assumes
'sigprocmask' on non-Windows hosts, so it doesn't need the
sigprocmask module.
* lib/signal.in.h, m4/pthread_sigmask.m4, m4/signal_h.m4:
New files, automatically imported from gnulib.
* lib/gnulib.mk, m4/gl-comp.m4: Automatically-imported update
due to the above changes.
* .bzrignore: Add lib/signal.h.
=== modified file '.bzrignore'
--- .bzrignore	2011-06-27 04:31:43 +0000
+++ .bzrignore	2011-07-06 17:54:08 +0000
@@ -61,6 +61,7 @@
 lib/unistd.h
 lib/warn-on-use.h
 lib/getopt.in-h
+lib/signal.h
 lib/stdbool.in-h
 lib/stddef.in-h
 lib/stdint.in-h

=== modified file 'Makefile.in'
--- Makefile.in	2011-06-25 08:40:38 +0000
+++ Makefile.in	2011-07-06 17:11:34 +0000
@@ -335,9 +335,11 @@
   alloca-opt \
   careadlinkat crypto/md5 crypto/sha1 crypto/sha256 crypto/sha512 dtoastr \
   dup2 \
-  filemode getloadavg getopt-gnu ignore-value intprops lstat mktime readlink \
+  filemode getloadavg getopt-gnu ignore-value intprops lstat \
+  mktime pthread_sigmask readlink \
   socklen stdarg stdio strftime strtoumax symlink sys_stat
 GNULIB_TOOL_FLAGS = \
+ --avoid=sigprocmask \
  --conditional-dependencies --import --no-changelog --no-vc-files \
  --makefile-name=gnulib.mk
 sync-from-gnulib: $(gnulib_srcdir)

=== modified file 'lib/gnulib.mk'
--- lib/gnulib.mk	2011-06-25 08:40:38 +0000
+++ lib/gnulib.mk	2011-07-06 17:15:18 +0000
@@ -9,7 +9,7 @@
 # the same distribution terms as the rest of that program.
 #
 # Generated by gnulib-tool.
-# Reproduce by: gnulib-tool --import --dir=. --lib=libgnu --source-base=lib --m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=. --makefile-name=gnulib.mk --conditional-dependencies --no-libtool --macro-prefix=gl --no-vc-files alloca-opt careadlinkat crypto/md5 crypto/sha1 crypto/sha256 crypto/sha512 dtoastr dup2 filemode getloadavg getopt-gnu ignore-value intprops lstat mktime readlink socklen stdarg stdio strftime strtoumax symlink sys_stat
+# Reproduce by: gnulib-tool --import --dir=. --lib=libgnu --source-base=lib --m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=. --avoid=sigprocmask --makefile-name=gnulib.mk --conditional-dependencies --no-libtool --macro-prefix=gl --no-vc-files alloca-opt careadlinkat crypto/md5 crypto/sha1 crypto/sha256 crypto/sha512 dtoastr dup2 filemode getloadavg getopt-gnu ignore-value intprops lstat mktime pthread_sigmask readlink socklen stdarg stdio strftime strtoumax symlink sys_stat


 MOSTLYCLEANFILES += core *.stackdump
@@ -303,6 +303,44 @@

 ## end   gnulib module readlink

+## begin gnulib module signal
+
+BUILT_SOURCES += signal.h
+
+# We need the following in order to create <signal.h> when the system
+# doesn't have a complete one.
+signal.h: signal.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+	$(AM_V_GEN)rm -f $@-t $@ && \
+	{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+	  sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+	      -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+	      -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+	      -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+	      -e 's|@''NEXT_SIGNAL_H''@|$(NEXT_SIGNAL_H)|g' \
+	      -e 's|@''GNULIB_PTHREAD_SIGMASK''@|$(GNULIB_PTHREAD_SIGMASK)|g' \
+	      -e 's/@''GNULIB_SIGNAL_H_SIGPIPE''@/$(GNULIB_SIGNAL_H_SIGPIPE)/g' \
+	      -e 's/@''GNULIB_SIGPROCMASK''@/$(GNULIB_SIGPROCMASK)/g' \
+	      -e 's/@''GNULIB_SIGACTION''@/$(GNULIB_SIGACTION)/g' \
+	      -e 's|@''HAVE_POSIX_SIGNALBLOCKING''@|$(HAVE_POSIX_SIGNALBLOCKING)|g' \
+	      -e 's|@''HAVE_SIGSET_T''@|$(HAVE_SIGSET_T)|g' \
+	      -e 's|@''HAVE_SIGINFO_T''@|$(HAVE_SIGINFO_T)|g' \
+	      -e 's|@''HAVE_SIGACTION''@|$(HAVE_SIGACTION)|g' \
+	      -e 's|@''HAVE_STRUCT_SIGACTION_SA_SIGACTION''@|$(HAVE_STRUCT_SIGACTION_SA_SIGACTION)|g' \
+	      -e 's|@''HAVE_TYPE_VOLATILE_SIG_ATOMIC_T''@|$(HAVE_TYPE_VOLATILE_SIG_ATOMIC_T)|g' \
+	      -e 's|@''HAVE_SIGHANDLER_T''@|$(HAVE_SIGHANDLER_T)|g' \
+	      -e 's|@''REPLACE_PTHREAD_SIGMASK''@|$(REPLACE_PTHREAD_SIGMASK)|g' \
+	      -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+	      -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+	      -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+	      < $(srcdir)/signal.in.h; \
+	} > $@-t && \
+	mv $@-t $@
+MOSTLYCLEANFILES += signal.h signal.h-t
+
+EXTRA_DIST += signal.in.h
+
+## end   gnulib module signal
+
 ## begin gnulib module stat

 if gl_GNULIB_ENABLED_stat

=== added file 'lib/signal.in.h'
--- lib/signal.in.h	1970-01-01 00:00:00 +0000
+++ lib/signal.in.h	2011-07-06 17:15:12 +0000
@@ -0,0 +1,392 @@
+/* A GNU-like <signal.h>.
+
+   Copyright (C) 2006-2011 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#if defined __need_sig_atomic_t || defined __need_sigset_t
+/* Special invocation convention inside glibc header files.  */
+
+# @INCLUDE_NEXT@ @NEXT_SIGNAL_H@
+
+#else
+/* Normal invocation convention.  */
+
+#ifndef _ <at> GUARD_PREFIX <at> _SIGNAL_H
+
+/* Define pid_t, uid_t.
+   Also, mingw defines sigset_t not in <signal.h>, but in <sys/types.h>.
+   On Solaris 10, <signal.h> includes <sys/types.h>, which eventually includes
+   us; so include <sys/types.h> now, before the second inclusion guard.  */
+#include <sys/types.h>
+
+/* The include_next requires a split double-inclusion guard.  */
+#@INCLUDE_NEXT@ @NEXT_SIGNAL_H@
+
+#ifndef _ <at> GUARD_PREFIX <at> _SIGNAL_H
+#define _ <at> GUARD_PREFIX <at> _SIGNAL_H
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
+
+/* The definition of _GL_ARG_NONNULL is copied here.  */
+
+/* The definition of _GL_WARN_ON_USE is copied here.  */
+
+/* On AIX, sig_atomic_t already includes volatile.  C99 requires that
+   'volatile sig_atomic_t' ignore the extra modifier, but C89 did not.
+   Hence, redefine this to a non-volatile type as needed.  */
+#if ! @HAVE_TYPE_VOLATILE_SIG_ATOMIC_T@
+# if !GNULIB_defined_sig_atomic_t
+typedef int rpl_sig_atomic_t;
+#  undef sig_atomic_t
+#  define sig_atomic_t rpl_sig_atomic_t
+#  define GNULIB_defined_sig_atomic_t 1
+# endif
+#endif
+
+/* A set or mask of signals.  */
+#if !@HAVE_SIGSET_T@
+# if !GNULIB_defined_sigset_t
+typedef unsigned int sigset_t;
+#  define GNULIB_defined_sigset_t 1
+# endif
+#endif
+
+/* Define sighandler_t, the type of signal handlers.  A GNU extension.  */
+#if !@HAVE_SIGHANDLER_T@
+# ifdef __cplusplus
+extern "C" {
+# endif
+# if !GNULIB_defined_sighandler_t
+typedef void (*sighandler_t) (int);
+#  define GNULIB_defined_sighandler_t 1
+# endif
+# ifdef __cplusplus
+}
+# endif
+#endif
+
+
+#if @GNULIB_SIGNAL_H_SIGPIPE@
+# ifndef SIGPIPE
+/* Define SIGPIPE to a value that does not overlap with other signals.  */
+#  define SIGPIPE 13
+#  define GNULIB_defined_SIGPIPE 1
+/* To actually use SIGPIPE, you also need the gnulib modules 'sigprocmask',
+   'write', 'stdio'.  */
+# endif
+#endif
+
+
+/* Maximum signal number + 1.  */
+#ifndef NSIG
+# if defined __TANDEM
+#  define NSIG 32
+# endif
+#endif
+
+
+#if @GNULIB_PTHREAD_SIGMASK@
+# if @REPLACE_PTHREAD_SIGMASK@
+#  undef pthread_sigmask
+#  define pthread_sigmask sigprocmask
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef pthread_sigmask
+# if HAVE_RAW_DECL_PTHREAD_SIGMASK
+_GL_WARN_ON_USE (pthread_sigmask, "pthread_sigmask is not portable - "
+                 "use gnulib module pthread_sigmask for portability");
+# endif
+#endif
+
+
+#if @GNULIB_SIGPROCMASK@
+# if !@HAVE_POSIX_SIGNALBLOCKING@
+
+/* Maximum signal number + 1.  */
+#  ifndef NSIG
+#   define NSIG 32
+#  endif
+
+/* This code supports only 32 signals.  */
+#  if !GNULIB_defined_verify_NSIG_constraint
+typedef int verify_NSIG_constraint[NSIG <= 32 ? 1 : -1];
+#   define GNULIB_defined_verify_NSIG_constraint 1
+#  endif
+
+# endif
+
+/* Test whether a given signal is contained in a signal set.  */
+# if @HAVE_POSIX_SIGNALBLOCKING@
+/* This function is defined as a macro on MacOS X.  */
+#  if defined __cplusplus && defined GNULIB_NAMESPACE
+#   undef sigismember
+#  endif
+# else
+_GL_FUNCDECL_SYS (sigismember, int, (const sigset_t *set, int sig)
+                                    _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (sigismember, int, (const sigset_t *set, int sig));
+_GL_CXXALIASWARN (sigismember);
+
+/* Initialize a signal set to the empty set.  */
+# if @HAVE_POSIX_SIGNALBLOCKING@
+/* This function is defined as a macro on MacOS X.  */
+#  if defined __cplusplus && defined GNULIB_NAMESPACE
+#   undef sigemptyset
+#  endif
+# else
+_GL_FUNCDECL_SYS (sigemptyset, int, (sigset_t *set) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (sigemptyset, int, (sigset_t *set));
+_GL_CXXALIASWARN (sigemptyset);
+
+/* Add a signal to a signal set.  */
+# if @HAVE_POSIX_SIGNALBLOCKING@
+/* This function is defined as a macro on MacOS X.  */
+#  if defined __cplusplus && defined GNULIB_NAMESPACE
+#   undef sigaddset
+#  endif
+# else
+_GL_FUNCDECL_SYS (sigaddset, int, (sigset_t *set, int sig)
+                                  _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (sigaddset, int, (sigset_t *set, int sig));
+_GL_CXXALIASWARN (sigaddset);
+
+/* Remove a signal from a signal set.  */
+# if @HAVE_POSIX_SIGNALBLOCKING@
+/* This function is defined as a macro on MacOS X.  */
+#  if defined __cplusplus && defined GNULIB_NAMESPACE
+#   undef sigdelset
+#  endif
+# else
+_GL_FUNCDECL_SYS (sigdelset, int, (sigset_t *set, int sig)
+                                  _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (sigdelset, int, (sigset_t *set, int sig));
+_GL_CXXALIASWARN (sigdelset);
+
+/* Fill a signal set with all possible signals.  */
+# if @HAVE_POSIX_SIGNALBLOCKING@
+/* This function is defined as a macro on MacOS X.  */
+#  if defined __cplusplus && defined GNULIB_NAMESPACE
+#   undef sigfillset
+#  endif
+# else
+_GL_FUNCDECL_SYS (sigfillset, int, (sigset_t *set) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (sigfillset, int, (sigset_t *set));
+_GL_CXXALIASWARN (sigfillset);
+
+/* Return the set of those blocked signals that are pending.  */
+# if !@HAVE_POSIX_SIGNALBLOCKING@
+_GL_FUNCDECL_SYS (sigpending, int, (sigset_t *set) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (sigpending, int, (sigset_t *set));
+_GL_CXXALIASWARN (sigpending);
+
+/* If OLD_SET is not NULL, put the current set of blocked signals in *OLD_SET.
+   Then, if SET is not NULL, affect the current set of blocked signals by
+   combining it with *SET as indicated in OPERATION.
+   In this implementation, you are not allowed to change a signal handler
+   while the signal is blocked.  */
+# if !@HAVE_POSIX_SIGNALBLOCKING@
+#  define SIG_BLOCK   0  /* blocked_set = blocked_set | *set; */
+#  define SIG_SETMASK 1  /* blocked_set = *set; */
+#  define SIG_UNBLOCK 2  /* blocked_set = blocked_set & ~*set; */
+_GL_FUNCDECL_SYS (sigprocmask, int,
+                  (int operation, const sigset_t *set, sigset_t *old_set));
+# endif
+_GL_CXXALIAS_SYS (sigprocmask, int,
+                  (int operation, const sigset_t *set, sigset_t *old_set));
+_GL_CXXALIASWARN (sigprocmask);
+
+/* Install the handler FUNC for signal SIG, and return the previous
+   handler.  */
+# ifdef __cplusplus
+extern "C" {
+# endif
+# if !GNULIB_defined_function_taking_int_returning_void_t
+typedef void (*_gl_function_taking_int_returning_void_t) (int);
+#  define GNULIB_defined_function_taking_int_returning_void_t 1
+# endif
+# ifdef __cplusplus
+}
+# endif
+# if !@HAVE_POSIX_SIGNALBLOCKING@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define signal rpl_signal
+#  endif
+_GL_FUNCDECL_RPL (signal, _gl_function_taking_int_returning_void_t,
+                  (int sig, _gl_function_taking_int_returning_void_t func));
+_GL_CXXALIAS_RPL (signal, _gl_function_taking_int_returning_void_t,
+                  (int sig, _gl_function_taking_int_returning_void_t func));
+# else
+_GL_CXXALIAS_SYS (signal, _gl_function_taking_int_returning_void_t,
+                  (int sig, _gl_function_taking_int_returning_void_t func));
+# endif
+_GL_CXXALIASWARN (signal);
+
+/* Raise signal SIG.  */
+# if !@HAVE_POSIX_SIGNALBLOCKING@ && GNULIB_defined_SIGPIPE
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef raise
+#   define raise rpl_raise
+#  endif
+_GL_FUNCDECL_RPL (raise, int, (int sig));
+_GL_CXXALIAS_RPL (raise, int, (int sig));
+# else
+_GL_CXXALIAS_SYS (raise, int, (int sig));
+# endif
+_GL_CXXALIASWARN (raise);
+
+#elif defined GNULIB_POSIXCHECK
+# undef sigaddset
+# if HAVE_RAW_DECL_SIGADDSET
+_GL_WARN_ON_USE (sigaddset, "sigaddset is unportable - "
+                 "use the gnulib module sigprocmask for portability");
+# endif
+# undef sigdelset
+# if HAVE_RAW_DECL_SIGDELSET
+_GL_WARN_ON_USE (sigdelset, "sigdelset is unportable - "
+                 "use the gnulib module sigprocmask for portability");
+# endif
+# undef sigemptyset
+# if HAVE_RAW_DECL_SIGEMPTYSET
+_GL_WARN_ON_USE (sigemptyset, "sigemptyset is unportable - "
+                 "use the gnulib module sigprocmask for portability");
+# endif
+# undef sigfillset
+# if HAVE_RAW_DECL_SIGFILLSET
+_GL_WARN_ON_USE (sigfillset, "sigfillset is unportable - "
+                 "use the gnulib module sigprocmask for portability");
+# endif
+# undef sigismember
+# if HAVE_RAW_DECL_SIGISMEMBER
+_GL_WARN_ON_USE (sigismember, "sigismember is unportable - "
+                 "use the gnulib module sigprocmask for portability");
+# endif
+# undef sigpending
+# if HAVE_RAW_DECL_SIGPENDING
+_GL_WARN_ON_USE (sigpending, "sigpending is unportable - "
+                 "use the gnulib module sigprocmask for portability");
+# endif
+# undef sigprocmask
+# if HAVE_RAW_DECL_SIGPROCMASK
+_GL_WARN_ON_USE (sigprocmask, "sigprocmask is unportable - "
+                 "use the gnulib module sigprocmask for portability");
+# endif
+#endif /* @GNULIB_SIGPROCMASK@ */
+
+
+#if @GNULIB_SIGACTION@
+# if !@HAVE_SIGACTION@
+
+#  if !@HAVE_SIGINFO_T@
+
+#   if !GNULIB_defined_siginfo_types
+
+/* Present to allow compilation, but unsupported by gnulib.  */
+union sigval
+{
+  int sival_int;
+  void *sival_ptr;
+};
+
+/* Present to allow compilation, but unsupported by gnulib.  */
+struct siginfo_t
+{
+  int si_signo;
+  int si_code;
+  int si_errno;
+  pid_t si_pid;
+  uid_t si_uid;
+  void *si_addr;
+  int si_status;
+  long si_band;
+  union sigval si_value;
+};
+typedef struct siginfo_t siginfo_t;
+
+#    define GNULIB_defined_siginfo_types 1
+#   endif
+
+#  endif /* !@HAVE_SIGINFO_T@ */
+
+/* We assume that platforms which lack the sigaction() function also lack
+   the 'struct sigaction' type, and vice versa.  */
+
+#  if !GNULIB_defined_struct_sigaction
+
+struct sigaction
+{
+  union
+  {
+    void (*_sa_handler) (int);
+    /* Present to allow compilation, but unsupported by gnulib.  POSIX
+       says that implementations may, but not must, make sa_sigaction
+       overlap with sa_handler, but we know of no implementation where
+       they do not overlap.  */
+    void (*_sa_sigaction) (int, siginfo_t *, void *);
+  } _sa_func;
+  sigset_t sa_mask;
+  /* Not all POSIX flags are supported.  */
+  int sa_flags;
+};
+#   define sa_handler _sa_func._sa_handler
+#   define sa_sigaction _sa_func._sa_sigaction
+/* Unsupported flags are not present.  */
+#   define SA_RESETHAND 1
+#   define SA_NODEFER 2
+#   define SA_RESTART 4
+
+#   define GNULIB_defined_struct_sigaction 1
+#  endif
+
+_GL_FUNCDECL_SYS (sigaction, int, (int, const struct sigaction *restrict,
+                                   struct sigaction *restrict));
+
+# elif !@HAVE_STRUCT_SIGACTION_SA_SIGACTION@
+
+#  define sa_sigaction sa_handler
+
+# endif /* !@HAVE_SIGACTION@, !@HAVE_STRUCT_SIGACTION_SA_SIGACTION@ */
+
+_GL_CXXALIAS_SYS (sigaction, int, (int, const struct sigaction *restrict,
+                                   struct sigaction *restrict));
+_GL_CXXALIASWARN (sigaction);
+
+#elif defined GNULIB_POSIXCHECK
+# undef sigaction
+# if HAVE_RAW_DECL_SIGACTION
+_GL_WARN_ON_USE (sigaction, "sigaction is unportable - "
+                 "use the gnulib module sigaction for portability");
+# endif
+#endif
+
+/* Some systems don't have SA_NODEFER.  */
+#ifndef SA_NODEFER
+# define SA_NODEFER 0
+#endif
+
+
+#endif /* _ <at> GUARD_PREFIX <at> _SIGNAL_H */
+#endif /* _ <at> GUARD_PREFIX <at> _SIGNAL_H */
+#endif

=== modified file 'm4/gl-comp.m4'
--- m4/gl-comp.m4	2011-06-25 08:40:38 +0000
+++ m4/gl-comp.m4	2011-07-06 17:25:15 +0000
@@ -52,7 +52,9 @@
   # Code from module lstat:
   # Code from module mktime:
   # Code from module multiarch:
+  # Code from module pthread_sigmask:
   # Code from module readlink:
+  # Code from module signal:
   # Code from module socklen:
   # Code from module ssize_t:
   # Code from module stat:
@@ -140,12 +142,15 @@
 fi
 gl_TIME_MODULE_INDICATOR([mktime])
 gl_MULTIARCH
+gl_PTHREAD_SIGMASK
+gl_SIGNAL_MODULE_INDICATOR([pthread_sigmask])
 gl_FUNC_READLINK
 if test $HAVE_READLINK = 0 || test $REPLACE_READLINK = 1; then
   AC_LIBOBJ([readlink])
   gl_PREREQ_READLINK
 fi
 gl_UNISTD_MODULE_INDICATOR([readlink])
+gl_SIGNAL_H
 gl_TYPE_SOCKLEN_T
 gt_TYPE_SSIZE_T
 gl_STDARG_H
@@ -241,6 +246,9 @@
   if test $REPLACE_LSTAT = 1; then
     func_gl_gnulib_m4code_stat
   fi
+  if test $REPLACE_PTHREAD_SIGMASK = 1; then
+    func_gl_gnulib_m4code_sigprocmask
+  fi
   if test $HAVE_READLINK = 0 || test $REPLACE_READLINK = 1; then
     func_gl_gnulib_m4code_stat
   fi
@@ -433,6 +441,7 @@
   lib/sha256.h
   lib/sha512.c
   lib/sha512.h
+  lib/signal.in.h
   lib/stat.c
   lib/stdarg.in.h
   lib/stdbool.in.h
@@ -470,10 +479,12 @@
   m4/md5.m4
   m4/mktime.m4
   m4/multiarch.m4
+  m4/pthread_sigmask.m4
   m4/readlink.m4
   m4/sha1.m4
   m4/sha256.m4
   m4/sha512.m4
+  m4/signal_h.m4
   m4/socklen.m4
   m4/ssize_t.m4
   m4/st_dm_mode.m4

=== added file 'm4/pthread_sigmask.m4'
--- m4/pthread_sigmask.m4	1970-01-01 00:00:00 +0000
+++ m4/pthread_sigmask.m4	2011-07-06 17:25:30 +0000
@@ -0,0 +1,26 @@
+# pthread_sigmask.m4 serial 2
+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],
+[
+  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"
+    else
+      ac_cv_func_pthread_sigmask=no
+    fi
+  ], [
+    AC_CHECK_FUNCS_ONCE([pthread_sigmask])
+  ])
+
+  if test $ac_cv_func_pthread_sigmask = no; then
+    REPLACE_PTHREAD_SIGMASK=1
+  fi
+])

=== added file 'm4/signal_h.m4'
--- m4/signal_h.m4	1970-01-01 00:00:00 +0000
+++ m4/signal_h.m4	2011-07-06 17:15:13 +0000
@@ -0,0 +1,76 @@
+# signal_h.m4 serial 14
+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,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_SIGNAL_H],
+[
+  AC_REQUIRE([gl_SIGNAL_H_DEFAULTS])
+  AC_REQUIRE([gl_CHECK_TYPE_SIGSET_T])
+  gl_NEXT_HEADERS([signal.h])
+
+# AIX declares sig_atomic_t to already include volatile, and C89 compilers
+# then choke on 'volatile sig_atomic_t'.  C99 requires that it compile.
+  AC_CHECK_TYPE([volatile sig_atomic_t], [],
+    [HAVE_TYPE_VOLATILE_SIG_ATOMIC_T=0], [[
+#include <signal.h>
+    ]])
+
+  AC_REQUIRE([AC_TYPE_UID_T])
+
+  dnl Persuade glibc <signal.h> to define sighandler_t.
+  AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+  AC_CHECK_TYPE([sighandler_t], [], [HAVE_SIGHANDLER_T=0], [[
+#include <signal.h>
+    ]])
+
+  dnl Check for declarations of anything we want to poison if the
+  dnl corresponding gnulib module is not in use.
+  gl_WARN_ON_USE_PREPARE([[#include <signal.h>
+    ]], [pthread_sigmask sigaction
+    sigaddset sigdelset sigemptyset sigfillset sigismember
+    sigpending sigprocmask])
+])
+
+AC_DEFUN([gl_CHECK_TYPE_SIGSET_T],
+[
+  AC_CHECK_TYPES([sigset_t],
+    [gl_cv_type_sigset_t=yes], [gl_cv_type_sigset_t=no],
+    [[
+      #include <signal.h>
+      /* Mingw defines sigset_t not in <signal.h>, but in <sys/types.h>.  */
+      #include <sys/types.h>
+    ]])
+  if test $gl_cv_type_sigset_t != yes; then
+    HAVE_SIGSET_T=0
+  fi
+])
+
+AC_DEFUN([gl_SIGNAL_MODULE_INDICATOR],
+[
+  dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+  AC_REQUIRE([gl_SIGNAL_H_DEFAULTS])
+  gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+  dnl Define it also as a C macro, for the benefit of the unit tests.
+  gl_MODULE_INDICATOR_FOR_TESTS([$1])
+])
+
+AC_DEFUN([gl_SIGNAL_H_DEFAULTS],
+[
+  GNULIB_PTHREAD_SIGMASK=0;    AC_SUBST([GNULIB_PTHREAD_SIGMASK])
+  GNULIB_SIGNAL_H_SIGPIPE=0;   AC_SUBST([GNULIB_SIGNAL_H_SIGPIPE])
+  GNULIB_SIGPROCMASK=0;        AC_SUBST([GNULIB_SIGPROCMASK])
+  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_SIGSET_T=1;             AC_SUBST([HAVE_SIGSET_T])
+  HAVE_SIGINFO_T=1;            AC_SUBST([HAVE_SIGINFO_T])
+  HAVE_SIGACTION=1;            AC_SUBST([HAVE_SIGACTION])
+  HAVE_STRUCT_SIGACTION_SA_SIGACTION=1;
+                               AC_SUBST([HAVE_STRUCT_SIGACTION_SA_SIGACTION])
+  HAVE_TYPE_VOLATILE_SIG_ATOMIC_T=1;
+                               AC_SUBST([HAVE_TYPE_VOLATILE_SIG_ATOMIC_T])
+  HAVE_SIGHANDLER_T=1;         AC_SUBST([HAVE_SIGHANDLER_T])
+  REPLACE_PTHREAD_SIGMASK=0;   AC_SUBST([REPLACE_PTHREAD_SIGMASK])
+])

================================================================================

Use pthread_sigmask, not sigprocmask.
* callproc.c (Fcall_process):
* sysdep.c (sys_sigblock, sys_sigunblock, sys_sigsetmask):
* process.c (create_process):
sigprocmask is portable only for single-threaded applications, and
Emacs can be multi-threaded when it uses GTK.
=== modified file 'src/callproc.c'
--- src/callproc.c	2011-06-21 01:06:45 +0000
+++ src/callproc.c	2011-07-06 17:11:43 +0000
@@ -596,7 +596,7 @@
     sigemptyset (&blocked);
     sigaddset (&blocked, SIGPIPE);
     sigaction (SIGPIPE, 0, &sigpipe_action);
-    sigprocmask (SIG_BLOCK, &blocked, &procmask);
+    pthread_sigmask (SIG_BLOCK, &blocked, &procmask);
 #endif

     BLOCK_INPUT;
@@ -633,7 +633,7 @@
 	   in the child.  */
 	//signal (SIGPIPE, SIG_DFL);
 #ifdef HAVE_WORKING_VFORK
-	sigprocmask (SIG_SETMASK, &procmask, 0);
+	pthread_sigmask (SIG_SETMASK, &procmask, 0);
 #endif

 	child_setup (filefd, fd1, fd_error, (char **) new_argv,
@@ -645,7 +645,7 @@
 #ifdef HAVE_WORKING_VFORK
     /* Restore the signal state.  */
     sigaction (SIGPIPE, &sigpipe_action, 0);
-    sigprocmask (SIG_SETMASK, &procmask, 0);
+    pthread_sigmask (SIG_SETMASK, &procmask, 0);
 #endif

 #endif /* not WINDOWSNT */

=== modified file 'src/process.c'
--- src/process.c	2011-07-01 09:18:46 +0000
+++ src/process.c	2011-07-06 17:11:43 +0000
@@ -1652,7 +1652,7 @@
   sigaddset (&blocked, SIGHUP );  sigaction (SIGHUP , 0, &sighup_action );
 #endif
 #endif /* HAVE_WORKING_VFORK */
-  sigprocmask (SIG_BLOCK, &blocked, &procmask);
+  pthread_sigmask (SIG_BLOCK, &blocked, &procmask);

   FD_SET (inchannel, &input_wait_mask);
   FD_SET (inchannel, &non_keyboard_wait_mask);
@@ -1808,7 +1808,7 @@
 	signal (SIGPIPE, SIG_DFL);

 	/* Stop blocking signals in the child.  */
-	sigprocmask (SIG_SETMASK, &procmask, 0);
+	pthread_sigmask (SIG_SETMASK, &procmask, 0);

 	if (pty_flag)
 	  child_setup_tty (xforkout);
@@ -1900,7 +1900,7 @@
 #endif
 #endif /* HAVE_WORKING_VFORK */
   /* Stop blocking signals in the parent.  */
-  sigprocmask (SIG_SETMASK, &procmask, 0);
+  pthread_sigmask (SIG_SETMASK, &procmask, 0);

   /* Now generate the error if vfork failed.  */
   if (pid < 0)

=== modified file 'src/sysdep.c'
--- src/sysdep.c	2011-07-05 02:51:15 +0000
+++ src/sysdep.c	2011-07-06 17:11:43 +0000
@@ -1534,7 +1534,7 @@
 sys_sigblock (sigset_t new_mask)
 {
   sigset_t old_mask;
-  sigprocmask (SIG_BLOCK, &new_mask, &old_mask);
+  pthread_sigmask (SIG_BLOCK, &new_mask, &old_mask);
   return (old_mask);
 }

@@ -1542,7 +1542,7 @@
 sys_sigunblock (sigset_t new_mask)
 {
   sigset_t old_mask;
-  sigprocmask (SIG_UNBLOCK, &new_mask, &old_mask);
+  pthread_sigmask (SIG_UNBLOCK, &new_mask, &old_mask);
   return (old_mask);
 }

@@ -1550,7 +1550,7 @@
 sys_sigsetmask (sigset_t new_mask)
 {
   sigset_t old_mask;
-  sigprocmask (SIG_SETMASK, &new_mask, &old_mask);
+  pthread_sigmask (SIG_SETMASK, &new_mask, &old_mask);
   return (old_mask);
 }






Information forwarded to owner <at> debbugs.gnu.org, bug-gnu-emacs <at> gnu.org:
bug#9010; Package emacs. (Thu, 07 Jul 2011 08:02:01 GMT) Full text and rfc822 format available.

Message #8 received at 9010 <at> debbugs.gnu.org (full text, mbox):

From: Jan Djärv <jan.h.d <at> swipnet.se>
To: Paul Eggert <eggert <at> cs.ucla.edu>
Cc: 9010 <at> debbugs.gnu.org
Subject: Re: bug#9010: sigprocmask -> pthread_sigmask for Emacs
Date: Thu, 07 Jul 2011 10:01:09 +0200
Hello.

Paul Eggert skrev 2011-07-06 20.11:
> Currently Emacs uses sigprocmask to alter signal masks, but
> sigprocmask is portable only for single-threaded applications, and
> Emacs can be multithreaded when it uses GTK (and is likely to
> become more multithreaded in the future).  I've seen bug reports
> about this for other apps, in which misuse of sigprocmask (where
> pthread_sigmask should be used) causes segfaults and the like.  I
> haven't reproduced the problem with GNU Emacs but any such bugs
> would quite possibly be random crashes that don't seem to be
> related to sigprocmask.
>

This looks ok, as long as all signal handlers have SIGNAL_THREAD_CHECK at the 
beginning (they currently do).

	Jan D.




Information forwarded to owner <at> debbugs.gnu.org, bug-gnu-emacs <at> gnu.org:
bug#9010; Package emacs. (Fri, 08 Jul 2011 07:21:02 GMT) Full text and rfc822 format available.

Message #11 received at submit <at> debbugs.gnu.org (full text, mbox):

From: Eli Zaretskii <eliz <at> gnu.org>
To: Paul Eggert <eggert <at> cs.ucla.edu>
Cc: bug-gnu-emacs <at> gnu.org
Subject: Re: sigprocmask -> pthread_sigmask for Emacs
Date: Fri, 08 Jul 2011 10:17:48 +0300
> Date: Wed, 06 Jul 2011 11:11:08 -0700
> From: Paul Eggert <eggert <at> cs.ucla.edu>
> CC: Eli Zaretskii <eliz <at> gnu.org>
> 
> To address this issue I plan to install the following patches, after
> some more testing.  The first patch is the gnulib part (almost all
> automatically-generated); the second patch is the patch to Emacs
> proper.  The gnulib part now generates a substitute file lib/signal.h
> for older hosts that don't have pthread_sigprocmask.
> 
> For the Windows port, I expect the simplest fix would be to add a
> pthread_sigmask function that turns around and calls sigprocmask, but
> maybe Windows has pthread_sigmask already?  And I don't expect the
> Windows port will need to worry about the signal.h wrapper.

Windows doesn't have pthread_sigmask, no.  The whole signal mask
feature doesn't make sense on Windows, because there are no Posix
signals per se (SIGINT is emulated, but only in console programs; the
Windows build of Emacs fakes SIGINT in a few more cases).

After your patch, will there be any code in Emacs that still uses
sigprocmask?  If not, we could just rename the w32.c sigprocmask stub
to pthread_sigmask.  If sigprocmask will still be used, then your
suggestion for pthread_sigmask to call sigprocmask is TRT.




Information forwarded to owner <at> debbugs.gnu.org, bug-gnu-emacs <at> gnu.org:
bug#9010; Package emacs. (Fri, 08 Jul 2011 10:00:03 GMT) Full text and rfc822 format available.

Message #14 received at 9010 <at> debbugs.gnu.org (full text, mbox):

From: Paul Eggert <eggert <at> cs.ucla.edu>
To: Eli Zaretskii <eliz <at> gnu.org>
Cc: 9010 <at> debbugs.gnu.org
Subject: Re: sigprocmask -> pthread_sigmask for Emacs
Date: Fri, 08 Jul 2011 02:58:55 -0700
On 07/08/11 00:17, Eli Zaretskii wrote:
> After your patch, will there be any code in Emacs that still uses
> sigprocmask?  If not, we could just rename the w32.c sigprocmask stub
> to pthread_sigmask.  If sigprocmask will still be used, then your
> suggestion for pthread_sigmask to call sigprocmask is TRT.

There will still be some code in lib-src/emacsclient.c that uses sigprocmask,
because emacsclient is single-threaded and does not need pthread_sigmask.
pthread_sigmask sometimes needs extra libraries, such as -lpthread;
these libraries are ordinarily linked into Emacs anyway, so it's no
big deal for Emacs to call pthread_sigmask, but I'd rather not have
single-threaded apps link to -lpthread if they don't need it.

Does emacsclient run on w32 and/or msdos?  If so, those libraries
will need both pthread_sigmask and sigprocmask.  If not, they can
simply drop sigprocmask.

I should mention that pthread_sigmask's API differs from that of sigprocmask
in one minor way: if there is an error, sigprocmask sets errno whereas pthread_sigmask
returns the error number.  Emacs doesn't care about the difference, as it
never looks at the error number, so the Windows libraries needn't worry
about this detail.




Information forwarded to owner <at> debbugs.gnu.org, bug-gnu-emacs <at> gnu.org:
bug#9010; Package emacs. (Fri, 08 Jul 2011 10:19:01 GMT) Full text and rfc822 format available.

Message #17 received at 9010 <at> debbugs.gnu.org (full text, mbox):

From: Eli Zaretskii <eliz <at> gnu.org>
To: Paul Eggert <eggert <at> cs.ucla.edu>
Cc: 9010 <at> debbugs.gnu.org
Subject: Re: sigprocmask -> pthread_sigmask for Emacs
Date: Fri, 08 Jul 2011 13:16:27 +0300
> Date: Fri, 08 Jul 2011 02:58:55 -0700
> From: Paul Eggert <eggert <at> cs.ucla.edu>
> CC: 9010 <at> debbugs.gnu.org
> 
> On 07/08/11 00:17, Eli Zaretskii wrote:
> > After your patch, will there be any code in Emacs that still uses
> > sigprocmask?  If not, we could just rename the w32.c sigprocmask stub
> > to pthread_sigmask.  If sigprocmask will still be used, then your
> > suggestion for pthread_sigmask to call sigprocmask is TRT.
> 
> There will still be some code in lib-src/emacsclient.c that uses sigprocmask,
> because emacsclient is single-threaded and does not need pthread_sigmask.
> pthread_sigmask sometimes needs extra libraries, such as -lpthread;
> these libraries are ordinarily linked into Emacs anyway, so it's no
> big deal for Emacs to call pthread_sigmask, but I'd rather not have
> single-threaded apps link to -lpthread if they don't need it.
> 
> Does emacsclient run on w32 and/or msdos?

emacsclient works on w32, but it doesn't use the part that calls
sigprocmask (NO_SOCKETS_IN_FILE_SYSTEM is defined on w32).  So this is
not an issue for w32.

The MSDOS port doesn't support emacsclient at all.

IIUC, using sigprocmask in Emacs proper will never be TRT.  If so, we
can simply rename the sigprocmask stub in w32 to be a pthread_sigmask
stub.




Information forwarded to owner <at> debbugs.gnu.org, bug-gnu-emacs <at> gnu.org:
bug#9010; Package emacs. (Fri, 08 Jul 2011 20:43:04 GMT) Full text and rfc822 format available.

Message #20 received at 9010 <at> debbugs.gnu.org (full text, mbox):

From: Paul Eggert <eggert <at> cs.ucla.edu>
To: Eli Zaretskii <eliz <at> gnu.org>
Cc: 9010 <at> debbugs.gnu.org
Subject: Re: sigprocmask -> pthread_sigmask for Emacs
Date: Fri, 08 Jul 2011 13:42:49 -0700
OK, I installed the patch into the trunk as bzr 105047.
This is a bit different from the earlier patch, as both
Emacs and gnulib have mutated in the meantime, but I don't
think the differences affect w32 or msdos.




Information forwarded to owner <at> debbugs.gnu.org, bug-gnu-emacs <at> gnu.org:
bug#9010; Package emacs. (Fri, 08 Jul 2011 23:31:02 GMT) Full text and rfc822 format available.

Message #23 received at 9010 <at> debbugs.gnu.org (full text, mbox):

From: Juanma Barranquero <lekktu <at> gmail.com>
To: Paul Eggert <eggert <at> cs.ucla.edu>
Cc: Eli Zaretskii <eliz <at> gnu.org>, 9010 <at> debbugs.gnu.org
Subject: Re: bug#9010: sigprocmask -> pthread_sigmask for Emacs
Date: Sat, 9 Jul 2011 01:29:28 +0200
On Fri, Jul 8, 2011 at 22:42, Paul Eggert <eggert <at> cs.ucla.edu> wrote:

> OK, I installed the patch into the trunk as bzr 105047.
> This is a bit different from the earlier patch, as both
> Emacs and gnulib have mutated in the meantime, but I don't
> think the differences affect w32 or msdos.

Oh, I'd say it does indeed:

oo-spd/i386/temacs1.a(process.o): In function `create_process':
C:\emacs\trunk\src/process.c:1655: undefined reference to `pthread_sigmask'
C:\emacs\trunk\src/process.c:1811: undefined reference to `pthread_sigmask'
C:\emacs\trunk\src/process.c:1903: undefined reference to `pthread_sigmask'
C:\emacs\trunk\src/process.c:1903: undefined reference to `pthread_sigmask'
oo-spd/i386/temacs2.a(sysdep.o): In function `sys_sigblock':
C:\emacs\repo\trunk\src/sysdep.c:1537: undefined reference to `pthread_sigmask'
oo-spd/i386/temacs2.a(sysdep.o):C:\emacs\trunk\src/sysdep.c:1545: more
undefined references to `pthread_sigmask' follow
collect2: ld returned 1 exit status
make[1]: *** [oo-spd/i386/temacs.exe] Error 1
make[1]: Leaving directory `C:/emacs/trunk/src'
make: *** [all-other-dirs-gmake] Error 2

    Juanma




Information forwarded to owner <at> debbugs.gnu.org, bug-gnu-emacs <at> gnu.org:
bug#9010; Package emacs. (Fri, 08 Jul 2011 23:33:02 GMT) Full text and rfc822 format available.

Message #26 received at 9010 <at> debbugs.gnu.org (full text, mbox):

From: Paul Eggert <eggert <at> cs.ucla.edu>
To: Juanma Barranquero <lekktu <at> gmail.com>
Cc: Eli Zaretskii <eliz <at> gnu.org>, 9010 <at> debbugs.gnu.org
Subject: Re: bug#9010: sigprocmask -> pthread_sigmask for Emacs
Date: Fri, 08 Jul 2011 16:32:39 -0700
On 07/08/11 16:29, Juanma Barranquero wrote:
>> OK, I installed the patch into the trunk as bzr 105047.
>> > This is a bit different from the earlier patch, as both
>> > Emacs and gnulib have mutated in the meantime, but I don't
>> > think the differences affect w32 or msdos.
> Oh, I'd say it does indeed:
> 
> oo-spd/i386/temacs1.a(process.o): In function `create_process':
> C:\emacs\trunk\src/process.c:1655: undefined reference to `pthread_sigmask'

No, that's what I would have expected from the earlier patch too.

As we discussed earlier, the Windows side needs to define pthread_sigmask,
much as it currently defines sigprocmask.  I can add that if you like,
but I can't easily test it, and it'd be better if someone with
Windows expertise did it.




Information forwarded to owner <at> debbugs.gnu.org, bug-gnu-emacs <at> gnu.org:
bug#9010; Package emacs. (Sat, 09 Jul 2011 00:15:02 GMT) Full text and rfc822 format available.

Message #29 received at 9010 <at> debbugs.gnu.org (full text, mbox):

From: Juanma Barranquero <lekktu <at> gmail.com>
To: Paul Eggert <eggert <at> cs.ucla.edu>
Cc: Eli Zaretskii <eliz <at> gnu.org>, 9010 <at> debbugs.gnu.org
Subject: Re: bug#9010: sigprocmask -> pthread_sigmask for Emacs
Date: Sat, 9 Jul 2011 02:13:38 +0200
On Sat, Jul 9, 2011 at 01:32, Paul Eggert <eggert <at> cs.ucla.edu> wrote:

> No, that's what I would have expected from the earlier patch too.

Sorry, I though you meant that it didn't need any W32 modification.

    Juanma




Information forwarded to owner <at> debbugs.gnu.org, bug-gnu-emacs <at> gnu.org:
bug#9010; Package emacs. (Sat, 09 Jul 2011 07:05:02 GMT) Full text and rfc822 format available.

Message #32 received at 9010 <at> debbugs.gnu.org (full text, mbox):

From: Eli Zaretskii <eliz <at> gnu.org>
To: Juanma Barranquero <lekktu <at> gmail.com>
Cc: eggert <at> cs.ucla.edu, 9010 <at> debbugs.gnu.org
Subject: Re: bug#9010: sigprocmask -> pthread_sigmask for Emacs
Date: Sat, 09 Jul 2011 10:02:20 +0300
> From: Juanma Barranquero <lekktu <at> gmail.com>
> Date: Sat, 9 Jul 2011 01:29:28 +0200
> Cc: Eli Zaretskii <eliz <at> gnu.org>, 9010 <at> debbugs.gnu.org
> 
> On Fri, Jul 8, 2011 at 22:42, Paul Eggert <eggert <at> cs.ucla.edu> wrote:
> 
> > OK, I installed the patch into the trunk as bzr 105047.
> > This is a bit different from the earlier patch, as both
> > Emacs and gnulib have mutated in the meantime, but I don't
> > think the differences affect w32 or msdos.
> 
> Oh, I'd say it does indeed:
> 
> oo-spd/i386/temacs1.a(process.o): In function `create_process':
> C:\emacs\trunk\src/process.c:1655: undefined reference to `pthread_sigmask'
> C:\emacs\trunk\src/process.c:1811: undefined reference to `pthread_sigmask'
> C:\emacs\trunk\src/process.c:1903: undefined reference to `pthread_sigmask'
> C:\emacs\trunk\src/process.c:1903: undefined reference to `pthread_sigmask'
> oo-spd/i386/temacs2.a(sysdep.o): In function `sys_sigblock':
> C:\emacs\repo\trunk\src/sysdep.c:1537: undefined reference to `pthread_sigmask'
> oo-spd/i386/temacs2.a(sysdep.o):C:\emacs\trunk\src/sysdep.c:1545: more
> undefined references to `pthread_sigmask' follow
> collect2: ld returned 1 exit status
> make[1]: *** [oo-spd/i386/temacs.exe] Error 1
> make[1]: Leaving directory `C:/emacs/trunk/src'
> make: *** [all-other-dirs-gmake] Error 2

Fixed.




bug closed, send any further explanations to 9010 <at> debbugs.gnu.org and Paul Eggert <eggert <at> cs.ucla.edu> Request was from Chong Yidong <cyd <at> stupidchicken.com> to control <at> debbugs.gnu.org. (Tue, 12 Jul 2011 03:22:03 GMT) Full text and rfc822 format available.

bug archived. Request was from Debbugs Internal Request <help-debbugs <at> gnu.org> to internal_control <at> debbugs.gnu.org. (Tue, 09 Aug 2011 11:24:04 GMT) Full text and rfc822 format available.

This bug report was last modified 12 years and 274 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.