[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