
On Tue, Nov 22, 2011 at 04:45:27PM +0100, Jiri Denemark wrote:
--- Notes: Version 5: - rebased on top of DanB's non-blocking patches; this is the only part that required non-trivial rebase so I'm posting it for additional review
Version 4: - no changes
Version 3: - no changes
Version 2: - no changes
src/rpc/virnetclient.c | 99 +++++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 90 insertions(+), 9 deletions(-)
diff --git a/src/rpc/virnetclient.c b/src/rpc/virnetclient.c index 025d270..b4b2fe7 100644 --- a/src/rpc/virnetclient.c +++ b/src/rpc/virnetclient.c @@ -101,9 +101,13 @@ struct _virNetClient {
size_t nstreams; virNetClientStreamPtr *streams; + + bool wantClose; };
+void virNetClientRequestClose(virNetClientPtr client); + static void virNetClientLock(virNetClientPtr client) { virMutexLock(&client->lock); @@ -409,12 +413,14 @@ void virNetClientFree(virNetClientPtr client) }
-void virNetClientClose(virNetClientPtr client) +static void +virNetClientCloseLocked(virNetClientPtr client) { - if (!client) + VIR_DEBUG("client=%p, sock=%p", client, client->sock); + + if (!client->sock) return;
- virNetClientLock(client); virNetSocketRemoveIOCallback(client->sock); virNetSocketFree(client->sock); client->sock = NULL; @@ -424,6 +430,41 @@ void virNetClientClose(virNetClientPtr client) virNetSASLSessionFree(client->sasl); client->sasl = NULL; #endif + client->wantClose = false; +} + +void virNetClientClose(virNetClientPtr client) +{ + if (!client) + return; + + virNetClientLock(client); + virNetClientCloseLocked(client); + virNetClientUnlock(client); +} + +void +virNetClientRequestClose(virNetClientPtr client) +{ + VIR_DEBUG("client=%p", client); + + virNetClientLock(client); + + /* If there is a thread polling for data on the socket, set wantClose flag + * and wake the thread up or just immediately close the socket when no-one + * is polling on it. + */ + if (client->waitDispatch) { + char ignore = 1; + int len = sizeof(ignore);
Minor nitpick s/int/size_t/ ACK Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|