Gnulib finally learned how to do pthread_sigmask on mingw.
We still have to worry about optional signals, like SIGWINCH,
but overall, this makes for less conditional code.
* .gnulib: Update to latest, for pthread_sigmask.
* bootstrap.conf (gnulib_modules): Add pthread_sigmask.
* configure.ac (AC_CHECK_FUNCS): Drop redundant check.
* src/rpc/virnetclient.c (virNetClientSetTLSSession)
(virNetClientIOEventLoop): Make code unconditional.
* src/util/command.c (virFork): Likewise.
* tools/virsh.c (doMigrate, cmdMigrate): Likewise.
---
.gnulib | 2 +-
bootstrap.conf | 1 +
configure.ac | 2 +-
src/rpc/virnetclient.c | 24 ++++++++----------------
src/util/command.c | 10 ----------
tools/virsh.c | 10 ----------
6 files changed, 11 insertions(+), 38 deletions(-)
diff --git a/.gnulib b/.gnulib
index 8db4963..adc3a5b 160000
--- a/.gnulib
+++ b/.gnulib
@@ -1 +1 @@
-Subproject commit 8db49630deab35ffbce5c113aed093359a75091d
+Subproject commit adc3a5b0083c935f5dcd408983e37c78cb8ebd7c
diff --git a/bootstrap.conf b/bootstrap.conf
index d3ff150..a800534 100644
--- a/bootstrap.conf
+++ b/bootstrap.conf
@@ -68,6 +68,7 @@ pipe2
poll
posix-shell
pthread
+pthread_sigmask
recv
random_r
sched
diff --git a/configure.ac b/configure.ac
index 13b4afb..aa589d6 100644
--- a/configure.ac
+++ b/configure.ac
@@ -130,7 +130,7 @@ dnl assumed). Because of $LIB_PTHREAD, we cannot use
AC_CHECK_FUNCS_ONCE.
dnl LIB_PTHREAD was set during gl_INIT by gnulib.
old_LIBS=$LIBS
LIBS="$LIBS $LIB_PTHREAD"
-AC_CHECK_FUNCS([pthread_sigmask pthread_mutexattr_init])
+AC_CHECK_FUNCS([pthread_mutexattr_init])
LIBS=$old_libs
dnl Availability of various common headers (non-fatal if missing).
diff --git a/src/rpc/virnetclient.c b/src/rpc/virnetclient.c
index 615de6c..6a112ee 100644
--- a/src/rpc/virnetclient.c
+++ b/src/rpc/virnetclient.c
@@ -273,14 +273,16 @@ int virNetClientSetTLSSession(virNetClientPtr client,
char buf[1];
int len;
struct pollfd fds[1];
-#ifdef HAVE_PTHREAD_SIGMASK
sigset_t oldmask, blockedsigs;
sigemptyset (&blockedsigs);
+#ifdef SIGWINCH
sigaddset (&blockedsigs, SIGWINCH);
+#endif
+#ifdef SIGCHLD
sigaddset (&blockedsigs, SIGCHLD);
- sigaddset (&blockedsigs, SIGPIPE);
#endif
+ sigaddset (&blockedsigs, SIGPIPE);
virNetClientLock(client);
@@ -311,18 +313,14 @@ int virNetClientSetTLSSession(virNetClientPtr client,
* after the call (RHBZ#567931). Same for SIGCHLD and SIGPIPE
* at the suggestion of Paolo Bonzini and Daniel Berrange.
*/
-#ifdef HAVE_PTHREAD_SIGMASK
ignore_value(pthread_sigmask(SIG_BLOCK, &blockedsigs, &oldmask));
-#endif
repoll:
ret = poll(fds, ARRAY_CARDINALITY(fds), -1);
if (ret < 0 && errno == EAGAIN)
goto repoll;
-#ifdef HAVE_PTHREAD_SIGMASK
ignore_value(pthread_sigmask(SIG_BLOCK, &oldmask, NULL));
-#endif
}
ret = virNetTLSContextCheckCertificate(tls, client->tls);
@@ -338,19 +336,15 @@ int virNetClientSetTLSSession(virNetClientPtr client,
fds[0].revents = 0;
fds[0].events = POLLIN;
-#ifdef HAVE_PTHREAD_SIGMASK
/* Block SIGWINCH from interrupting poll in curses programs */
ignore_value(pthread_sigmask(SIG_BLOCK, &blockedsigs, &oldmask));
-#endif
repoll2:
ret = poll(fds, ARRAY_CARDINALITY(fds), -1);
if (ret < 0 && errno == EAGAIN)
goto repoll2;
-#ifdef HAVE_PTHREAD_SIGMASK
ignore_value(pthread_sigmask(SIG_BLOCK, &oldmask, NULL));
-#endif
len = virNetTLSSessionRead(client->tls, buf, 1);
if (len < 0) {
@@ -800,9 +794,7 @@ static int virNetClientIOEventLoop(virNetClientPtr client,
virNetClientCallPtr tmp = client->waitDispatch;
virNetClientCallPtr prev;
char ignore;
-#ifdef HAVE_PTHREAD_SIGMASK
sigset_t oldmask, blockedsigs;
-#endif
int timeout = -1;
/* If we have existing SASL decoded data we
@@ -841,22 +833,22 @@ static int virNetClientIOEventLoop(virNetClientPtr client,
* after the call (RHBZ#567931). Same for SIGCHLD and SIGPIPE
* at the suggestion of Paolo Bonzini and Daniel Berrange.
*/
-#ifdef HAVE_PTHREAD_SIGMASK
sigemptyset (&blockedsigs);
+#ifdef SIGWINCH
sigaddset (&blockedsigs, SIGWINCH);
+#endif
+#ifdef SIGCHLD
sigaddset (&blockedsigs, SIGCHLD);
+#endif
sigaddset (&blockedsigs, SIGPIPE);
ignore_value(pthread_sigmask(SIG_BLOCK, &blockedsigs, &oldmask));
-#endif
repoll:
ret = poll(fds, ARRAY_CARDINALITY(fds), timeout);
if (ret < 0 && errno == EAGAIN)
goto repoll;
-#ifdef HAVE_PTHREAD_SIGMASK
ignore_value(pthread_sigmask(SIG_SETMASK, &oldmask, NULL));
-#endif
virNetClientLock(client);
diff --git a/src/util/command.c b/src/util/command.c
index 9fdeb0b..eae58b2 100644
--- a/src/util/command.c
+++ b/src/util/command.c
@@ -145,9 +145,7 @@ static int virClearCapabilities(void)
*/
int virFork(pid_t *pid) {
-# ifdef HAVE_PTHREAD_SIGMASK
sigset_t oldmask, newmask;
-# endif
struct sigaction sig_action;
int saved_errno, ret = -1;
@@ -157,7 +155,6 @@ int virFork(pid_t *pid) {
* Need to block signals now, so that child process can safely
* kill off caller's signal handlers without a race.
*/
-# ifdef HAVE_PTHREAD_SIGMASK
sigfillset(&newmask);
if (pthread_sigmask(SIG_SETMASK, &newmask, &oldmask) != 0) {
saved_errno = errno;
@@ -165,7 +162,6 @@ int virFork(pid_t *pid) {
"%s", _("cannot block signals"));
goto cleanup;
}
-# endif
/* Ensure we hold the logging lock, to protect child processes
* from deadlocking on another thread's inherited mutex state */
@@ -178,11 +174,9 @@ int virFork(pid_t *pid) {
virLogUnlock();
if (*pid < 0) {
-# ifdef HAVE_PTHREAD_SIGMASK
/* attempt to restore signal mask, but ignore failure, to
avoid obscuring the fork failure */
ignore_value (pthread_sigmask(SIG_SETMASK, &oldmask, NULL));
-# endif
virReportSystemError(saved_errno,
"%s", _("cannot fork child process"));
goto cleanup;
@@ -192,7 +186,6 @@ int virFork(pid_t *pid) {
/* parent process */
-# ifdef HAVE_PTHREAD_SIGMASK
/* Restore our original signal mask now that the child is
safely running */
if (pthread_sigmask(SIG_SETMASK, &oldmask, NULL) != 0) {
@@ -200,7 +193,6 @@ int virFork(pid_t *pid) {
virReportSystemError(errno, "%s", _("cannot unblock
signals"));
goto cleanup;
}
-# endif
ret = 0;
} else {
@@ -237,7 +229,6 @@ int virFork(pid_t *pid) {
sigaction(i, &sig_action, NULL);
}
-# ifdef HAVE_PTHREAD_SIGMASK
/* Unmask all signals in child, since we've no idea
what the caller's done with their signal mask
and don't want to propagate that to children */
@@ -247,7 +238,6 @@ int virFork(pid_t *pid) {
virReportSystemError(errno, "%s", _("cannot unblock
signals"));
goto cleanup;
}
-# endif
ret = 0;
}
diff --git a/tools/virsh.c b/tools/virsh.c
index 9a189fd..2e776ec 100644
--- a/tools/virsh.c
+++ b/tools/virsh.c
@@ -4400,14 +4400,12 @@ doMigrate (void *opaque)
const vshCmd *cmd = data->cmd;
const char *xmlfile = NULL;
char *xml = NULL;
-#if HAVE_PTHREAD_SIGMASK
sigset_t sigmask, oldsigmask;
sigemptyset(&sigmask);
sigaddset(&sigmask, SIGINT);
if (pthread_sigmask(SIG_BLOCK, &sigmask, &oldsigmask) < 0)
goto out_sig;
-#endif
if (!vshConnectionUsability (ctl, ctl->conn))
goto out;
@@ -4483,10 +4481,8 @@ doMigrate (void *opaque)
}
out:
-#if HAVE_PTHREAD_SIGMASK
pthread_sigmask(SIG_SETMASK, &oldsigmask, NULL);
out_sig:
-#endif
if (dom) virDomainFree (dom);
VIR_FREE(xml);
ignore_value(safewrite(data->writefd, &ret, sizeof(ret)));
@@ -4534,12 +4530,10 @@ cmdMigrate (vshControl *ctl, const vshCmd *cmd)
struct timeval start, curr;
bool live_flag = false;
vshCtrlData data;
-#if HAVE_PTHREAD_SIGMASK
sigset_t sigmask, oldsigmask;
sigemptyset(&sigmask);
sigaddset(&sigmask, SIGINT);
-#endif
if (!(dom = vshCommandOptDomain(ctl, cmd, NULL)))
return false;
@@ -4631,13 +4625,9 @@ repoll:
}
if (verbose) {
-#if HAVE_PTHREAD_SIGMASK
pthread_sigmask(SIG_BLOCK, &sigmask, &oldsigmask);
-#endif
ret = virDomainGetJobInfo(dom, &jobinfo);
-#if HAVE_PTHREAD_SIGMASK
pthread_sigmask(SIG_SETMASK, &oldsigmask, NULL);
-#endif
if (ret == 0)
print_job_progress(jobinfo.dataRemaining, jobinfo.dataTotal);
}
--
1.7.4.4