[libvirt] [PATCH v14 02/49] virhostdev: use virObject to virHostdevManager to keep reference

Daniel P. Berrange berrange at redhat.com
Mon Mar 10 17:12:12 UTC 2014


On Fri, Mar 07, 2014 at 06:52:29PM +0800, Chunyan Liu wrote:
> Use virObject to virHostdevManager, so that each driver using virHostdevManager
> can keep a reference to it, and through counting refs to make virHostdevManager
> get freed.
> 
> Signed-off-by: Chunyan Liu <cyliu at suse.com>
> ---
>  src/util/virhostdev.c | 54 ++++++++++++++++++++++++++++++++++++++-------------
>  1 file changed, 40 insertions(+), 14 deletions(-)
> 
> diff --git a/src/util/virhostdev.c b/src/util/virhostdev.c
> index cc8ae78..bb2888f 100644
> --- a/src/util/virhostdev.c
> +++ b/src/util/virhostdev.c
> @@ -41,11 +41,31 @@
>  #define VIR_FROM_THIS VIR_FROM_NONE
>  #define HOSTDEV_STATE_DIR LOCALSTATEDIR "/run/libvirt/hostdevmgr"
>  
> -static virHostdevManagerPtr hostdevMgr;
> +static virHostdevManagerPtr g_hostdev_mgr; /* global hostdev manager*/
> +
> +static virClassPtr virHostdevManagerClass;
> +static void virHostdevManagerDispose(void *obj);
> +
> +static int virHostdevManagerOnceInit(void)
> +{
> +    virHostdevManagerClass = virClassNew(virClassForObject(),
> +                                         "virHostdevManager",
> +                                         sizeof(virHostdevManager),
> +                                         virHostdevManagerDispose);
> +
> +    if (!virHostdevManagerClass)
> +        return -1;
> +    else
> +        return 0;
> +}
> +
> +VIR_ONCE_GLOBAL_INIT(virHostdevManager)
>  
>  static void
> -virHostdevManagerCleanup(void)
> +virHostdevManagerDispose(void *obj)
>  {
> +    virHostdevManagerPtr hostdevMgr = obj;
> +
>      if (!hostdevMgr)
>          return;
>  
> @@ -58,11 +78,16 @@ virHostdevManagerCleanup(void)
>      VIR_FREE(hostdevMgr);
>  }
>  
> -static int
> -virHostdevOnceInit(void)
> +static virHostdevManagerPtr
> +virHostdevManagerNew(void)
>  {
> -    if (VIR_ALLOC(hostdevMgr) < 0)
> -        goto error;
> +    virHostdevManagerPtr hostdevMgr;
> +
> +    if (virHostdevManagerInitialize() < 0)
> +        return NULL;
> +
> +    if (!(hostdevMgr = virObjectNew(virHostdevManagerClass)))
> +        return NULL;
>  
>      if ((hostdevMgr->activePciHostdevs = virPCIDeviceListNew()) == NULL)
>          goto error;
> @@ -86,19 +111,20 @@ virHostdevOnceInit(void)
>          goto error;
>      }
>  
> -    return 0;
> +    return hostdevMgr;
>  
>  error:
> -    virHostdevManagerCleanup();
> -    return -1;
> +    virObjectUnref(hostdevMgr);
> +    return NULL;
>  }
>  
> -VIR_ONCE_GLOBAL_INIT(virHostdev)
> -
>  virHostdevManagerPtr
>  virHostdevManagerGetDefault(void)
>  {
> -    if (virHostdevInitialize() < 0)
> -        return NULL;
> -    return hostdevMgr;
> +    if (g_hostdev_mgr == NULL) {
> +        g_hostdev_mgr = virHostdevManagerNew();
> +        return g_hostdev_mgr;
> +    } else {
> +        return virObjectRef(g_hostdev_mgr);
> +    }
>  }

Technically this is not threadsafe, but we only use it during libvirtd
daemon initialization so we're ok IMHO. Also if the last reference is
removed,the we never clear  g_hostdev_mgr - could do that in the dispose
method easily enough so I'll fix that.

Regards,
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