[libvirt] [PATCH 2/2] remote: react to failures on wakeupFD
Jim Meyering
jim at meyering.net
Wed Apr 14 20:01:18 UTC 2010
Eric Blake wrote:
> * 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,
This looks fine, but "errno ? errno : 0" is equivalent to just "errno".
Which makes me think you'll want to separate the saferead-fails case
(where errno is nonzero) from the
saferead-returns-non-negative-<=-sizeof-ignore case (in which
case virReportSystemError would print "Success" for 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... */
More information about the libvir-list
mailing list