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(a)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 :|