[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[libvirt] [PATCH 2/2] remote: react to failures on wakeupFD



* src/remote/remote_driver.c (remoteIO, remoteIOEventLoop): Report
failures on pipe used for wakeup.
Reported by Chris Lalancette.
---
 src/remote/remote_driver.c |   26 ++++++++++++++++++++++----
 1 files changed, 22 insertions(+), 4 deletions(-)

diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c
index ebcfcd8..b1e8048 100644
--- a/src/remote/remote_driver.c
+++ b/src/remote/remote_driver.c
@@ -9524,8 +9524,12 @@ remoteIOEventLoop(virConnectPtr conn,

         if (fds[1].revents) {
             DEBUG0("Woken up from poll by other thread");
-            ignore_value(saferead(priv->wakeupReadFD, &ignore,
-                                  sizeof(ignore)));
+            if (saferead(priv->wakeupReadFD, &ignore, sizeof(ignore))
+                != sizeof(ignore)) {
+                virReportSystemError(errno ? errno : 0,
+                                     "%s", _("read on wakeup fd failed"));
+                goto error;
+            }
         }

         if (ret < 0) {
@@ -9661,6 +9665,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 +9673,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... */
-- 
1.6.6.1


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]