diff --git a/.gnulib b/.gnulib index c3153d2c0c..56005a21e8 160000 --- a/.gnulib +++ b/.gnulib @@ -1 +1 @@ -Subproject commit c3153d2c0cf5f675ae13ae2bd1dee0f463b9c86a +Subproject commit 56005a21e8f9f434212a19dcb628c6d3b179fd08 diff --git a/bootstrap.conf b/bootstrap.conf index d3ff150607..a800534908 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 13b4afbd0c..aa589d646a 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 615de6c2c8..6a112eea70 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); - sigaddset (&blockedsigs, SIGCHLD); - sigaddset (&blockedsigs, SIGPIPE); #endif +#ifdef SIGCHLD + sigaddset (&blockedsigs, SIGCHLD); +#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 9fdeb0bf19..eae58b25ae 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 9a189fddbf..2e776ec2f1 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); }