1
0
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:
John Ferlan 2017-05-15 14:31:44 -04:00
parent 92840eb3a7
commit 46f5eca4b2
5 changed files with 68 additions and 67 deletions

View File

@ -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

View File

@ -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;

View File

@ -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);

View File

@ -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

View File

@ -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;
} }