]> xenbits.xensource.com Git - libvirt.git/commitdiff
Fix busy-wait loop on closed file descriptor
authorDaniel P. Berrange <berrange@redhat.com>
Tue, 17 Aug 2010 15:30:51 +0000 (16:30 +0100)
committerDaniel P. Berrange <berrange@redhat.com>
Thu, 11 Nov 2010 16:03:26 +0000 (16:03 +0000)
When closing open streams after a client quits, the event
callback was not removed. This mean that poll() was using
a closed FD and returning POLLNVAL in a busy-wait loop.

* daemon/stream.c: Disconnect stream callbacks

daemon/stream.c

index d64fe739e9f096830c06dd1d002376e0488328ca..cac54ea68dbde85b01e0d42f97d03120c1c61a43 100644 (file)
@@ -108,6 +108,7 @@ remoteStreamEvent(virStreamPtr st, int events, void *opaque)
         remote_error rerr;
         memset(&rerr, 0, sizeof rerr);
         stream->closed = 1;
+        virStreamEventRemoveCallback(stream->st);
         virStreamAbort(stream->st);
         if (events & VIR_STREAM_EVENT_HANGUP)
             remoteDispatchFormatError(&rerr, "%s", _("stream had unexpected termination"));
@@ -345,8 +346,10 @@ remoteRemoveClientStream(struct qemud_client *client,
         }
     }
 
-    if (!stream->closed)
+    if (!stream->closed) {
+        virStreamEventRemoveCallback(stream->st);
         virStreamAbort(stream->st);
+    }
 
     while (curr) {
         if (curr == stream) {
@@ -429,6 +432,7 @@ remoteStreamHandleFinish(struct qemud_client *client,
     memset(&rerr, 0, sizeof rerr);
 
     stream->closed = 1;
+    virStreamEventRemoveCallback(stream->st);
     ret = virStreamFinish(stream->st);
 
     if (ret < 0) {
@@ -462,6 +466,7 @@ remoteStreamHandleAbort(struct qemud_client *client,
     memset(&rerr, 0, sizeof rerr);
 
     stream->closed = 1;
+    virStreamEventRemoveCallback(stream->st);
     virStreamAbort(stream->st);
 
     if (msg->hdr.status == REMOTE_ERROR)