[libvirt] [PATCH v5 07/13] Add support for async close of client RPC socket

Daniel P. Berrange berrange at redhat.com
Thu Nov 24 10:01:30 UTC 2011


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 :|




More information about the libvir-list mailing list