[libvirt] [PATCH] build: use gnulib pthread_sigmask

Eric Blake eblake at redhat.com
Wed Jul 6 17:24:12 UTC 2011


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




More information about the libvir-list mailing list