From: Jiri Denemark Date: Mon, 28 Nov 2011 16:41:25 +0000 (+0100) Subject: rpc: Really send non-blocking calls while waiting for another call X-Git-Tag: v0.9.8-rc1~61 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4e511fcc18aa4929ee0b46d91251dd4a2fb2a194;p=thirdparty%2Flibvirt.git rpc: Really send non-blocking calls while waiting for another call When another thread was dispatching while we wanted to send a non-blocking call, we correctly queued the call and woke up the thread but the thread just threw the call away since it forgot to recheck if its socket was writable. --- diff --git a/src/rpc/virnetclient.c b/src/rpc/virnetclient.c index aad7f5d79b..a738129623 100644 --- a/src/rpc/virnetclient.c +++ b/src/rpc/virnetclient.c @@ -1381,6 +1381,16 @@ static int virNetClientIOEventLoop(virNetClientPtr client, _("read on wakeup fd failed")); goto error; } + + /* If we were woken up because a new non-blocking call was queued, + * we need to re-poll to check if we can send it. + */ + if (virNetClientCallMatchPredicate(client->waitDispatch, + virNetClientIOEventLoopWantNonBlock, + NULL)) { + VIR_DEBUG("New non-blocking call arrived; repolling"); + continue; + } } if (ret < 0) {