mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-07 17:28:15 +00:00
interface: Convert virInterfaceObj to use virObjectLockable
Now that we have a bit more control, let's convert our object into a lockable object and let that magic handle the create and lock/unlock. This commit also introduces virInterfaceObjEndAPI in order to handle the lock unlock and object unref in one call for consumers returning a NULL obj upon return. This removes the need for virInterfaceObj{Lock|Unlock} external API's. Signed-off-by: John Ferlan <jferlan@redhat.com>
This commit is contained in:
parent
92840eb3a7
commit
46f5eca4b2
@ -44,7 +44,6 @@ src/conf/storage_adapter_conf.c
|
|||||||
src/conf/storage_conf.c
|
src/conf/storage_conf.c
|
||||||
src/conf/virchrdev.c
|
src/conf/virchrdev.c
|
||||||
src/conf/virdomainobjlist.c
|
src/conf/virdomainobjlist.c
|
||||||
src/conf/virinterfaceobj.c
|
|
||||||
src/conf/virnetworkobj.c
|
src/conf/virnetworkobj.c
|
||||||
src/conf/virnodedeviceobj.c
|
src/conf/virnodedeviceobj.c
|
||||||
src/conf/virnwfilterobj.c
|
src/conf/virnwfilterobj.c
|
||||||
|
@ -33,7 +33,7 @@
|
|||||||
VIR_LOG_INIT("conf.virinterfaceobj");
|
VIR_LOG_INIT("conf.virinterfaceobj");
|
||||||
|
|
||||||
struct _virInterfaceObj {
|
struct _virInterfaceObj {
|
||||||
virMutex lock;
|
virObjectLockable parent;
|
||||||
|
|
||||||
bool active; /* true if interface is active (up) */
|
bool active; /* true if interface is active (up) */
|
||||||
virInterfaceDefPtr def; /* The interface definition */
|
virInterfaceDefPtr def; /* The interface definition */
|
||||||
@ -46,22 +46,45 @@ struct _virInterfaceObjList {
|
|||||||
|
|
||||||
/* virInterfaceObj manipulation */
|
/* virInterfaceObj manipulation */
|
||||||
|
|
||||||
|
static virClassPtr virInterfaceObjClass;
|
||||||
|
static void virInterfaceObjDispose(void *obj);
|
||||||
|
|
||||||
|
static int
|
||||||
|
virInterfaceObjOnceInit(void)
|
||||||
|
{
|
||||||
|
if (!(virInterfaceObjClass = virClassNew(virClassForObjectLockable(),
|
||||||
|
"virInterfaceObj",
|
||||||
|
sizeof(virInterfaceObj),
|
||||||
|
virInterfaceObjDispose)))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
VIR_ONCE_GLOBAL_INIT(virInterfaceObj)
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
virInterfaceObjDispose(void *opaque)
|
||||||
|
{
|
||||||
|
virInterfaceObjPtr obj = opaque;
|
||||||
|
|
||||||
|
virInterfaceDefFree(obj->def);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static virInterfaceObjPtr
|
static virInterfaceObjPtr
|
||||||
virInterfaceObjNew(virInterfaceDefPtr def)
|
virInterfaceObjNew(virInterfaceDefPtr def)
|
||||||
{
|
{
|
||||||
virInterfaceObjPtr obj;
|
virInterfaceObjPtr obj;
|
||||||
|
|
||||||
if (VIR_ALLOC(obj) < 0)
|
if (virInterfaceObjInitialize() < 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (virMutexInit(&obj->lock) < 0) {
|
if (!(obj = virObjectLockableNew(virInterfaceObjClass)))
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
|
||||||
"%s", _("cannot initialize mutex"));
|
|
||||||
VIR_FREE(obj);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
|
||||||
|
|
||||||
virInterfaceObjLock(obj);
|
virObjectLock(obj);
|
||||||
obj->def = def;
|
obj->def = def;
|
||||||
|
|
||||||
return obj;
|
return obj;
|
||||||
@ -69,28 +92,14 @@ virInterfaceObjNew(virInterfaceDefPtr def)
|
|||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
virInterfaceObjLock(virInterfaceObjPtr obj)
|
virInterfaceObjEndAPI(virInterfaceObjPtr *obj)
|
||||||
{
|
{
|
||||||
virMutexLock(&obj->lock);
|
if (!*obj)
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
virInterfaceObjUnlock(virInterfaceObjPtr obj)
|
|
||||||
{
|
|
||||||
virMutexUnlock(&obj->lock);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
virInterfaceObjFree(virInterfaceObjPtr obj)
|
|
||||||
{
|
|
||||||
if (!obj)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
virInterfaceDefFree(obj->def);
|
virObjectUnlock(*obj);
|
||||||
virMutexDestroy(&obj->lock);
|
virObjectUnref(*obj);
|
||||||
VIR_FREE(obj);
|
*obj = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -141,18 +150,18 @@ virInterfaceObjListFindByMACString(virInterfaceObjListPtr interfaces,
|
|||||||
virInterfaceObjPtr obj = interfaces->objs[i];
|
virInterfaceObjPtr obj = interfaces->objs[i];
|
||||||
virInterfaceDefPtr def;
|
virInterfaceDefPtr def;
|
||||||
|
|
||||||
virInterfaceObjLock(obj);
|
virObjectLock(obj);
|
||||||
def = obj->def;
|
def = obj->def;
|
||||||
if (STRCASEEQ(def->mac, mac)) {
|
if (STRCASEEQ(def->mac, mac)) {
|
||||||
if (matchct < maxmatches) {
|
if (matchct < maxmatches) {
|
||||||
if (VIR_STRDUP(matches[matchct], def->name) < 0) {
|
if (VIR_STRDUP(matches[matchct], def->name) < 0) {
|
||||||
virInterfaceObjUnlock(obj);
|
virObjectUnlock(obj);
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
matchct++;
|
matchct++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
virInterfaceObjUnlock(obj);
|
virObjectUnlock(obj);
|
||||||
}
|
}
|
||||||
return matchct;
|
return matchct;
|
||||||
|
|
||||||
@ -174,11 +183,11 @@ virInterfaceObjListFindByName(virInterfaceObjListPtr interfaces,
|
|||||||
virInterfaceObjPtr obj = interfaces->objs[i];
|
virInterfaceObjPtr obj = interfaces->objs[i];
|
||||||
virInterfaceDefPtr def;
|
virInterfaceDefPtr def;
|
||||||
|
|
||||||
virInterfaceObjLock(obj);
|
virObjectLock(obj);
|
||||||
def = obj->def;
|
def = obj->def;
|
||||||
if (STREQ(def->name, name))
|
if (STREQ(def->name, name))
|
||||||
return obj;
|
return virObjectRef(obj);
|
||||||
virInterfaceObjUnlock(obj);
|
virObjectUnlock(obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -191,7 +200,7 @@ virInterfaceObjListFree(virInterfaceObjListPtr interfaces)
|
|||||||
size_t i;
|
size_t i;
|
||||||
|
|
||||||
for (i = 0; i < interfaces->count; i++)
|
for (i = 0; i < interfaces->count; i++)
|
||||||
virInterfaceObjFree(interfaces->objs[i]);
|
virObjectUnref(interfaces->objs[i]);
|
||||||
VIR_FREE(interfaces->objs);
|
VIR_FREE(interfaces->objs);
|
||||||
VIR_FREE(interfaces);
|
VIR_FREE(interfaces);
|
||||||
}
|
}
|
||||||
@ -228,7 +237,7 @@ virInterfaceObjListClone(virInterfaceObjListPtr interfaces)
|
|||||||
VIR_FREE(xml);
|
VIR_FREE(xml);
|
||||||
if (!(obj = virInterfaceObjListAssignDef(dest, backup)))
|
if (!(obj = virInterfaceObjListAssignDef(dest, backup)))
|
||||||
goto error;
|
goto error;
|
||||||
virInterfaceObjUnlock(obj); /* locked by virInterfaceObjListAssignDef */
|
virInterfaceObjEndAPI(&obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
return dest;
|
return dest;
|
||||||
@ -258,13 +267,10 @@ virInterfaceObjListAssignDef(virInterfaceObjListPtr interfaces,
|
|||||||
if (VIR_APPEND_ELEMENT_COPY(interfaces->objs,
|
if (VIR_APPEND_ELEMENT_COPY(interfaces->objs,
|
||||||
interfaces->count, obj) < 0) {
|
interfaces->count, obj) < 0) {
|
||||||
obj->def = NULL;
|
obj->def = NULL;
|
||||||
virInterfaceObjUnlock(obj);
|
virInterfaceObjEndAPI(&obj);
|
||||||
virInterfaceObjFree(obj);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
return virObjectRef(obj);
|
||||||
return obj;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -274,17 +280,17 @@ virInterfaceObjListRemove(virInterfaceObjListPtr interfaces,
|
|||||||
{
|
{
|
||||||
size_t i;
|
size_t i;
|
||||||
|
|
||||||
virInterfaceObjUnlock(obj);
|
virObjectUnlock(obj);
|
||||||
for (i = 0; i < interfaces->count; i++) {
|
for (i = 0; i < interfaces->count; i++) {
|
||||||
virInterfaceObjLock(interfaces->objs[i]);
|
virObjectLock(interfaces->objs[i]);
|
||||||
if (interfaces->objs[i] == obj) {
|
if (interfaces->objs[i] == obj) {
|
||||||
virInterfaceObjUnlock(interfaces->objs[i]);
|
virObjectUnlock(interfaces->objs[i]);
|
||||||
virInterfaceObjFree(interfaces->objs[i]);
|
virObjectUnref(interfaces->objs[i]);
|
||||||
|
|
||||||
VIR_DELETE_ELEMENT(interfaces->objs, i, interfaces->count);
|
VIR_DELETE_ELEMENT(interfaces->objs, i, interfaces->count);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
virInterfaceObjUnlock(interfaces->objs[i]);
|
virObjectUnlock(interfaces->objs[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -298,10 +304,10 @@ virInterfaceObjListNumOfInterfaces(virInterfaceObjListPtr interfaces,
|
|||||||
|
|
||||||
for (i = 0; (i < interfaces->count); i++) {
|
for (i = 0; (i < interfaces->count); i++) {
|
||||||
virInterfaceObjPtr obj = interfaces->objs[i];
|
virInterfaceObjPtr obj = interfaces->objs[i];
|
||||||
virInterfaceObjLock(obj);
|
virObjectLock(obj);
|
||||||
if (wantActive == virInterfaceObjIsActive(obj))
|
if (wantActive == virInterfaceObjIsActive(obj))
|
||||||
ninterfaces++;
|
ninterfaces++;
|
||||||
virInterfaceObjUnlock(obj);
|
virObjectUnlock(obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ninterfaces;
|
return ninterfaces;
|
||||||
@ -321,16 +327,16 @@ virInterfaceObjListGetNames(virInterfaceObjListPtr interfaces,
|
|||||||
virInterfaceObjPtr obj = interfaces->objs[i];
|
virInterfaceObjPtr obj = interfaces->objs[i];
|
||||||
virInterfaceDefPtr def;
|
virInterfaceDefPtr def;
|
||||||
|
|
||||||
virInterfaceObjLock(obj);
|
virObjectLock(obj);
|
||||||
def = obj->def;
|
def = obj->def;
|
||||||
if (wantActive == virInterfaceObjIsActive(obj)) {
|
if (wantActive == virInterfaceObjIsActive(obj)) {
|
||||||
if (VIR_STRDUP(names[nnames], def->name) < 0) {
|
if (VIR_STRDUP(names[nnames], def->name) < 0) {
|
||||||
virInterfaceObjUnlock(obj);
|
virObjectUnlock(obj);
|
||||||
goto failure;
|
goto failure;
|
||||||
}
|
}
|
||||||
nnames++;
|
nnames++;
|
||||||
}
|
}
|
||||||
virInterfaceObjUnlock(obj);
|
virObjectUnlock(obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
return nnames;
|
return nnames;
|
||||||
|
@ -28,6 +28,9 @@ typedef virInterfaceObj *virInterfaceObjPtr;
|
|||||||
typedef struct _virInterfaceObjList virInterfaceObjList;
|
typedef struct _virInterfaceObjList virInterfaceObjList;
|
||||||
typedef virInterfaceObjList *virInterfaceObjListPtr;
|
typedef virInterfaceObjList *virInterfaceObjListPtr;
|
||||||
|
|
||||||
|
void
|
||||||
|
virInterfaceObjEndAPI(virInterfaceObjPtr *obj);
|
||||||
|
|
||||||
virInterfaceDefPtr
|
virInterfaceDefPtr
|
||||||
virInterfaceObjGetDef(virInterfaceObjPtr obj);
|
virInterfaceObjGetDef(virInterfaceObjPtr obj);
|
||||||
|
|
||||||
@ -68,12 +71,6 @@ void
|
|||||||
virInterfaceObjListRemove(virInterfaceObjListPtr interfaces,
|
virInterfaceObjListRemove(virInterfaceObjListPtr interfaces,
|
||||||
virInterfaceObjPtr obj);
|
virInterfaceObjPtr obj);
|
||||||
|
|
||||||
void
|
|
||||||
virInterfaceObjLock(virInterfaceObjPtr obj);
|
|
||||||
|
|
||||||
void
|
|
||||||
virInterfaceObjUnlock(virInterfaceObjPtr obj);
|
|
||||||
|
|
||||||
typedef bool
|
typedef bool
|
||||||
(*virInterfaceObjListFilter)(virConnectPtr conn,
|
(*virInterfaceObjListFilter)(virConnectPtr conn,
|
||||||
virInterfaceDefPtr def);
|
virInterfaceDefPtr def);
|
||||||
|
@ -912,6 +912,7 @@ virDomainObjListRename;
|
|||||||
|
|
||||||
|
|
||||||
# conf/virinterfaceobj.h
|
# conf/virinterfaceobj.h
|
||||||
|
virInterfaceObjEndAPI;
|
||||||
virInterfaceObjGetDef;
|
virInterfaceObjGetDef;
|
||||||
virInterfaceObjIsActive;
|
virInterfaceObjIsActive;
|
||||||
virInterfaceObjListAssignDef;
|
virInterfaceObjListAssignDef;
|
||||||
@ -923,9 +924,7 @@ virInterfaceObjListGetNames;
|
|||||||
virInterfaceObjListNew;
|
virInterfaceObjListNew;
|
||||||
virInterfaceObjListNumOfInterfaces;
|
virInterfaceObjListNumOfInterfaces;
|
||||||
virInterfaceObjListRemove;
|
virInterfaceObjListRemove;
|
||||||
virInterfaceObjLock;
|
|
||||||
virInterfaceObjSetActive;
|
virInterfaceObjSetActive;
|
||||||
virInterfaceObjUnlock;
|
|
||||||
|
|
||||||
|
|
||||||
# conf/virnetworkobj.h
|
# conf/virnetworkobj.h
|
||||||
|
@ -1027,7 +1027,7 @@ testParseInterfaces(testDriverPtr privconn,
|
|||||||
}
|
}
|
||||||
|
|
||||||
virInterfaceObjSetActive(obj, true);
|
virInterfaceObjSetActive(obj, true);
|
||||||
virInterfaceObjUnlock(obj);
|
virInterfaceObjEndAPI(&obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = 0;
|
ret = 0;
|
||||||
@ -3718,7 +3718,7 @@ testInterfaceLookupByName(virConnectPtr conn,
|
|||||||
|
|
||||||
ret = virGetInterface(conn, def->name, def->mac);
|
ret = virGetInterface(conn, def->name, def->mac);
|
||||||
|
|
||||||
virInterfaceObjUnlock(obj);
|
virInterfaceObjEndAPI(&obj);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3769,7 +3769,7 @@ testInterfaceIsActive(virInterfacePtr iface)
|
|||||||
|
|
||||||
ret = virInterfaceObjIsActive(obj);
|
ret = virInterfaceObjIsActive(obj);
|
||||||
|
|
||||||
virInterfaceObjUnlock(obj);
|
virInterfaceObjEndAPI(&obj);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3881,7 +3881,7 @@ testInterfaceGetXMLDesc(virInterfacePtr iface,
|
|||||||
|
|
||||||
ret = virInterfaceDefFormat(def);
|
ret = virInterfaceDefFormat(def);
|
||||||
|
|
||||||
virInterfaceObjUnlock(obj);
|
virInterfaceObjEndAPI(&obj);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3912,8 +3912,7 @@ testInterfaceDefineXML(virConnectPtr conn,
|
|||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
virInterfaceDefFree(def);
|
virInterfaceDefFree(def);
|
||||||
if (obj)
|
virInterfaceObjEndAPI(&obj);
|
||||||
virInterfaceObjUnlock(obj);
|
|
||||||
testDriverUnlock(privconn);
|
testDriverUnlock(privconn);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -3929,6 +3928,7 @@ testInterfaceUndefine(virInterfacePtr iface)
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
virInterfaceObjListRemove(privconn->ifaces, obj);
|
virInterfaceObjListRemove(privconn->ifaces, obj);
|
||||||
|
virObjectUnref(obj);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -3956,7 +3956,7 @@ testInterfaceCreate(virInterfacePtr iface,
|
|||||||
ret = 0;
|
ret = 0;
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
virInterfaceObjUnlock(obj);
|
virInterfaceObjEndAPI(&obj);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3983,7 +3983,7 @@ testInterfaceDestroy(virInterfacePtr iface,
|
|||||||
ret = 0;
|
ret = 0;
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
virInterfaceObjUnlock(obj);
|
virInterfaceObjEndAPI(&obj);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user