]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
remote: react to failures on wakeupFD
authorEric Blake <eblake@redhat.com>
Tue, 9 Mar 2010 22:17:21 +0000 (15:17 -0700)
committerEric Blake <eblake@redhat.com>
Thu, 15 Apr 2010 17:40:08 +0000 (11:40 -0600)
* src/remote/remote_driver.c (remoteIO, remoteIOEventLoop): Report
failures on pipe used for wakeup.
Reported by Chris Lalancette.

src/remote/remote_driver.c

index ebcfcd86b8fc9c1535dd9d5bf46fdd8a73a2a636..e3df27b271953b7119cb152b972bd9416f3aaab0 100644 (file)
@@ -9523,9 +9523,18 @@ remoteIOEventLoop(virConnectPtr conn,
         remoteDriverLock(priv);
 
         if (fds[1].revents) {
+            ssize_t s;
             DEBUG0("Woken up from poll by other thread");
-            ignore_value(saferead(priv->wakeupReadFD, &ignore,
-                                  sizeof(ignore)));
+            s = saferead(priv->wakeupReadFD, &ignore, sizeof(ignore));
+            if (s < 0) {
+                virReportSystemError(errno, "%s",
+                                     _("read on wakeup fd failed"));
+                goto error;
+            } else if (s != sizeof(ignore)) {
+                remoteError(VIR_ERR_INTERNAL_ERROR, "%s",
+                            _("read on wakeup fd failed"));
+                goto error;
+            }
         }
 
         if (ret < 0) {
@@ -9661,6 +9670,7 @@ remoteIO(virConnectPtr conn,
         /* Stick ourselves on the end of the wait queue */
         struct remote_thread_call *tmp = priv->waitDispatch;
         char ignore = 1;
+        ssize_t s;
         while (tmp && tmp->next)
             tmp = tmp->next;
         if (tmp)
@@ -9668,8 +9678,21 @@ remoteIO(virConnectPtr conn,
         else
             priv->waitDispatch = thiscall;
 
-        /* Force other thread to wakup from poll */
-        ignore_value(safewrite(priv->wakeupSendFD, &ignore, sizeof(ignore)));
+        /* Force other thread to wakeup from poll */
+        s = safewrite(priv->wakeupSendFD, &ignore, sizeof(ignore));
+        if (s < 0) {
+            char errout[1024];
+            remoteError(VIR_ERR_INTERNAL_ERROR,
+                        _("failed to wake up polling thread: %s"),
+                        virStrerror(errno, errout, sizeof errout));
+            VIR_FREE(thiscall);
+            return -1;
+        } else if (s != sizeof(ignore)) {
+            remoteError(VIR_ERR_INTERNAL_ERROR, "%s",
+                        _("failed to wake up polling thread"));
+            VIR_FREE(thiscall);
+            return -1;
+        }
 
         DEBUG("Going to sleep %d %p %p", thiscall->proc_nr, priv->waitDispatch, thiscall);
         /* Go to sleep while other thread is working... */