提交 8437e738 编写于 作者: E Eric Blake

build: use gnulib pthread_sigmask

Gnulib finally learned how to do pthread_sigmask on mingw.

* .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.
上级 c2dda6eb
.gnulib @ 56005a21
Subproject commit c3153d2c0cf5f675ae13ae2bd1dee0f463b9c86a
Subproject commit 56005a21e8f9f434212a19dcb628c6d3b179fd08
......@@ -68,6 +68,7 @@ pipe2
poll
posix-shell
pthread
pthread_sigmask
recv
random_r
sched
......
......@@ -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).
......
......@@ -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);
......
......@@ -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;
}
......
......@@ -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);
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册