Rework the code such that virDomainObjListFindByID will always
return a locked/ref counted object so that the callers can
always do the same cleanup logic to call virDomainObjEndAPI.
Makes accessing the objects much more consistent.
NB:
There were 3 callers (lxcDomainLookupByID, testDomainLookupByID,
and qemuDomainLookupByID) that were already using the ByID name,
but not the virDomainObjEndAPI - these were changed as well in
this update/patch.
Signed-off-by: John Ferlan <jferlan(a)redhat.com>
---
src/bhyve/bhyve_driver.c | 2 +-
src/conf/virdomainobjlist.c | 35 +++++++++--------------------------
src/conf/virdomainobjlist.h | 2 --
src/libvirt_private.syms | 1 -
src/libxl/libxl_domain.c | 2 +-
src/libxl/libxl_driver.c | 2 +-
src/lxc/lxc_driver.c | 3 +--
src/openvz/openvz_driver.c | 2 +-
src/qemu/qemu_driver.c | 5 ++---
src/test/test_driver.c | 3 +--
src/uml/uml_driver.c | 2 +-
src/vmware/vmware_driver.c | 2 +-
src/vz/vz_driver.c | 2 +-
13 files changed, 20 insertions(+), 43 deletions(-)
diff --git a/src/bhyve/bhyve_driver.c b/src/bhyve/bhyve_driver.c
index 4f95f6c15..1fd31912d 100644
--- a/src/bhyve/bhyve_driver.c
+++ b/src/bhyve/bhyve_driver.c
@@ -847,7 +847,7 @@ bhyveDomainLookupByID(virConnectPtr conn,
virDomainObjPtr vm;
virDomainPtr dom = NULL;
- vm = virDomainObjListFindByIDRef(privconn->domains, id);
+ vm = virDomainObjListFindByID(privconn->domains, id);
if (!vm) {
virReportError(VIR_ERR_NO_DOMAIN,
diff --git a/src/conf/virdomainobjlist.c b/src/conf/virdomainobjlist.c
index 3290dfa29..983b6fda7 100644
--- a/src/conf/virdomainobjlist.c
+++ b/src/conf/virdomainobjlist.c
@@ -112,44 +112,27 @@ static int virDomainObjListSearchID(const void *payload,
return want;
}
-static virDomainObjPtr
-virDomainObjListFindByIDInternal(virDomainObjListPtr doms,
- int id,
- bool ref)
+
+virDomainObjPtr
+virDomainObjListFindByID(virDomainObjListPtr doms,
+ int id)
{
virDomainObjPtr obj;
+
virObjectRWLockRead(doms);
obj = virHashSearch(doms->objs, virDomainObjListSearchID, &id, NULL);
- if (ref) {
- virObjectRef(obj);
- virObjectRWUnlock(doms);
- }
+ virObjectRef(obj);
+ virObjectRWUnlock(doms);
if (obj) {
virObjectLock(obj);
if (obj->removing) {
virObjectUnlock(obj);
- if (ref)
- virObjectUnref(obj);
+ virObjectUnref(obj);
obj = NULL;
}
}
- if (!ref)
- virObjectRWUnlock(doms);
- return obj;
-}
-
-virDomainObjPtr
-virDomainObjListFindByID(virDomainObjListPtr doms,
- int id)
-{
- return virDomainObjListFindByIDInternal(doms, id, false);
-}
-virDomainObjPtr
-virDomainObjListFindByIDRef(virDomainObjListPtr doms,
- int id)
-{
- return virDomainObjListFindByIDInternal(doms, id, true);
+ return obj;
}
diff --git a/src/conf/virdomainobjlist.h b/src/conf/virdomainobjlist.h
index 1b77a95ba..7e2dece3a 100644
--- a/src/conf/virdomainobjlist.h
+++ b/src/conf/virdomainobjlist.h
@@ -34,8 +34,6 @@ virDomainObjListPtr virDomainObjListNew(void);
virDomainObjPtr virDomainObjListFindByID(virDomainObjListPtr doms,
int id);
-virDomainObjPtr virDomainObjListFindByIDRef(virDomainObjListPtr doms,
- int id);
virDomainObjPtr virDomainObjListFindByUUID(virDomainObjListPtr doms,
const unsigned char *uuid);
virDomainObjPtr virDomainObjListFindByName(virDomainObjListPtr doms,
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 6f0cd9680..5b6a9d899 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -948,7 +948,6 @@ virDomainObjListCollect;
virDomainObjListConvert;
virDomainObjListExport;
virDomainObjListFindByID;
-virDomainObjListFindByIDRef;
virDomainObjListFindByName;
virDomainObjListFindByUUID;
virDomainObjListForEach;
diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c
index e76740247..6332b9ae2 100644
--- a/src/libxl/libxl_domain.c
+++ b/src/libxl/libxl_domain.c
@@ -443,7 +443,7 @@ libxlDomainShutdownThread(void *opaque)
cfg = libxlDriverConfigGet(driver);
- vm = virDomainObjListFindByIDRef(driver->domains, ev->domid);
+ vm = virDomainObjListFindByID(driver->domains, ev->domid);
if (!vm) {
VIR_INFO("Received event for unknown domain ID %d", ev->domid);
goto cleanup;
diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
index 1379e9b83..5091592c6 100644
--- a/src/libxl/libxl_driver.c
+++ b/src/libxl/libxl_driver.c
@@ -1090,7 +1090,7 @@ libxlDomainLookupByID(virConnectPtr conn, int id)
virDomainObjPtr vm;
virDomainPtr dom = NULL;
- vm = virDomainObjListFindByIDRef(driver->domains, id);
+ vm = virDomainObjListFindByID(driver->domains, id);
if (!vm) {
virReportError(VIR_ERR_NO_DOMAIN, NULL);
goto cleanup;
diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c
index ed3f0fbc9..afa533c40 100644
--- a/src/lxc/lxc_driver.c
+++ b/src/lxc/lxc_driver.c
@@ -269,8 +269,7 @@ static virDomainPtr lxcDomainLookupByID(virConnectPtr conn,
dom = virGetDomain(conn, vm->def->name, vm->def->uuid,
vm->def->id);
cleanup:
- if (vm)
- virObjectUnlock(vm);
+ virDomainObjEndAPI(&vm);
return dom;
}
diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c
index 3d4e66168..5b88118de 100644
--- a/src/openvz/openvz_driver.c
+++ b/src/openvz/openvz_driver.c
@@ -346,7 +346,7 @@ static virDomainPtr openvzDomainLookupByID(virConnectPtr conn,
virDomainPtr dom = NULL;
openvzDriverLock(driver);
- vm = virDomainObjListFindByIDRef(driver->domains, id);
+ vm = virDomainObjListFindByID(driver->domains, id);
openvzDriverUnlock(driver);
if (!vm) {
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 4972b1fef..53e597f23 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -1530,7 +1530,7 @@ static virDomainPtr qemuDomainLookupByID(virConnectPtr conn,
virDomainObjPtr vm;
virDomainPtr dom = NULL;
- vm = virDomainObjListFindByID(driver->domains, id);
+ vm = virDomainObjListFindByID(driver->domains, id);
if (!vm) {
virReportError(VIR_ERR_NO_DOMAIN,
@@ -1544,8 +1544,7 @@ static virDomainPtr qemuDomainLookupByID(virConnectPtr conn,
dom = virGetDomain(conn, vm->def->name, vm->def->uuid,
vm->def->id);
cleanup:
- if (vm)
- virObjectUnlock(vm);
+ virDomainObjEndAPI(&vm);
return dom;
}
diff --git a/src/test/test_driver.c b/src/test/test_driver.c
index bef15c826..f39e785a1 100644
--- a/src/test/test_driver.c
+++ b/src/test/test_driver.c
@@ -1713,8 +1713,7 @@ static virDomainPtr testDomainLookupByID(virConnectPtr conn,
ret = virGetDomain(conn, dom->def->name, dom->def->uuid,
dom->def->id);
cleanup:
- if (dom)
- virObjectUnlock(dom);
+ virDomainObjEndAPI(&dom);
return ret;
}
diff --git a/src/uml/uml_driver.c b/src/uml/uml_driver.c
index 91797c0eb..bbccbf5e1 100644
--- a/src/uml/uml_driver.c
+++ b/src/uml/uml_driver.c
@@ -1379,7 +1379,7 @@ static virDomainPtr umlDomainLookupByID(virConnectPtr conn,
virDomainPtr dom = NULL;
umlDriverLock(driver);
- vm = virDomainObjListFindByIDRef(driver->domains, id);
+ vm = virDomainObjListFindByID(driver->domains, id);
umlDriverUnlock(driver);
if (!vm) {
diff --git a/src/vmware/vmware_driver.c b/src/vmware/vmware_driver.c
index f427361d1..94c7fbadd 100644
--- a/src/vmware/vmware_driver.c
+++ b/src/vmware/vmware_driver.c
@@ -831,7 +831,7 @@ vmwareDomainLookupByID(virConnectPtr conn, int id)
virDomainPtr dom = NULL;
vmwareDriverLock(driver);
- vm = virDomainObjListFindByIDRef(driver->domains, id);
+ vm = virDomainObjListFindByID(driver->domains, id);
vmwareDriverUnlock(driver);
if (!vm) {
diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c
index caa0170da..850faa3b1 100644
--- a/src/vz/vz_driver.c
+++ b/src/vz/vz_driver.c
@@ -578,7 +578,7 @@ vzDomainLookupByID(virConnectPtr conn, int id)
virDomainPtr ret = NULL;
virDomainObjPtr dom;
- dom = virDomainObjListFindByIDRef(privconn->driver->domains, id);
+ dom = virDomainObjListFindByID(privconn->driver->domains, id);
if (dom == NULL) {
virReportError(VIR_ERR_NO_DOMAIN, NULL);
--
2.13.6