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 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list