Paul Eggert wrote: > 2011-07-05 Paul Eggert <egg...@cs.ucla.edu> > > + pthread_sigmask: new module > + * MODULES.html.sh (Support for systems lacking POSIX:2008): Add it. > + * doc/posix-functions/pthread_sigmask.texi: Document new module. > + * lib/signal.in.h (pthread_sigmask): Arrange for replacement. > + This is done only as a macro; I don't know how well that'll > + work for C++. Move <sys/types.h> include before the include_next, > + to avoid mishap on Solaris. > + * m4/signal_h.m4 (gl_SIGNAL_H, gl_SIGNAL_H_DEFAULTS): Check for it. > + * modules/signal (Makefile.am): Substitute the check's results. > + * modules/pthread_sigmask, m4/pthread_sigmask.m4: New files.
This module has a number of problems: 1) wrong return value, 2) link errors in C++ mode, 3) portability problems to FreeBSD and others, 4) portability problems to OSF/1, 5) no unit test. Let's start with the first one. POSIX specifies that pthread_sigmask returns an error code. Unlike sigprocmask, which returns -1 when it fails. This fixes it. 2011-07-07 Bruno Haible <br...@clisp.org> pthread_sigmask: Fix return value. * lib/signal.in.h (pthread_sigmask): Declare. Don't define as a macro. * lib/pthread_sigmask.c: New file. * modules/pthread_sigmask (Files): Add it. (configure.ac): Invoke AC_LIBOBJ. ============================ lib/pthread_sigmask.c ============================ /* POSIX compatible signal blocking for threads. Copyright (C) 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/>. */ #include <config.h> /* Specification. */ #include <signal.h> #include <errno.h> int pthread_sigmask (int how, const sigset_t *new_mask, sigset_t *old_mask) { int ret = sigprocmask (how, new_mask, old_mask); return (ret < 0 ? errno : 0); } =============================================================================== --- lib/signal.in.h.orig Fri Jul 8 01:44:55 2011 +++ lib/signal.in.h Fri Jul 8 01:42:35 2011 @@ -104,8 +104,8 @@ #if @GNULIB_PTHREAD_SIGMASK@ # if @REPLACE_PTHREAD_SIGMASK@ -# undef pthread_sigmask -# define pthread_sigmask sigprocmask +_GL_FUNCDECL_SYS (pthread_sigmask, int, + (int how, const sigset_t *new_mask, sigset_t *old_mask)); # endif #elif defined GNULIB_POSIXCHECK # undef pthread_sigmask --- modules/pthread_sigmask.orig Fri Jul 8 01:44:55 2011 +++ modules/pthread_sigmask Fri Jul 8 01:43:33 2011 @@ -2,6 +2,7 @@ POSIX compatible signal blocking for threads. Files: +lib/pthread_sigmask.c m4/pthread_sigmask.m4 Depends-on: @@ -10,6 +11,9 @@ configure.ac: gl_PTHREAD_SIGMASK +if test $REPLACE_PTHREAD_SIGMASK = 1; then + AC_LIBOBJ([pthread_sigmask]) +fi gl_SIGNAL_MODULE_INDICATOR([pthread_sigmask]) Makefile.am: -- In memoriam Georges Mandel <http://en.wikipedia.org/wiki/Georges_Mandel>