提交 dcb5d8bb 编写于 作者: J John Ferlan

storage: Convert virStoragePoolObj into virObjectLockable

Now that we're moved the object into virstorageobj, let's make the
code use the lockable object.
上级 5d5c732d
...@@ -36,8 +36,10 @@ ...@@ -36,8 +36,10 @@
VIR_LOG_INIT("conf.virstorageobj"); VIR_LOG_INIT("conf.virstorageobj");
static virClassPtr virStoragePoolObjClass;
static void static void
virStoragePoolObjUnlock(virStoragePoolObjPtr obj); virStoragePoolObjDispose(void *opaque);
struct _virStorageVolDefList { struct _virStorageVolDefList {
...@@ -46,7 +48,7 @@ struct _virStorageVolDefList { ...@@ -46,7 +48,7 @@ struct _virStorageVolDefList {
}; };
struct _virStoragePoolObj { struct _virStoragePoolObj {
virMutex lock; virObjectLockable parent;
char *configFile; char *configFile;
char *autostartLink; char *autostartLink;
...@@ -60,21 +62,34 @@ struct _virStoragePoolObj { ...@@ -60,21 +62,34 @@ struct _virStoragePoolObj {
virStorageVolDefList volumes; virStorageVolDefList volumes;
}; };
static int
virStoragePoolObjOnceInit(void)
{
if (!(virStoragePoolObjClass = virClassNew(virClassForObjectLockable(),
"virStoragePoolObj",
sizeof(virStoragePoolObj),
virStoragePoolObjDispose)))
return -1;
return 0;
}
VIR_ONCE_GLOBAL_INIT(virStoragePoolObj)
virStoragePoolObjPtr virStoragePoolObjPtr
virStoragePoolObjNew(void) virStoragePoolObjNew(void)
{ {
virStoragePoolObjPtr obj; virStoragePoolObjPtr obj;
if (VIR_ALLOC(obj) < 0) if (virStoragePoolObjInitialize() < 0)
return NULL; return NULL;
if (virMutexInit(&obj->lock) < 0) { if (!(obj = virObjectLockableNew(virStoragePoolObjClass)))
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("cannot initialize mutex"));
VIR_FREE(obj);
return NULL; return NULL;
}
virStoragePoolObjLock(obj); virObjectLock(obj);
obj->active = false; obj->active = false;
return obj; return obj;
} }
...@@ -86,7 +101,9 @@ virStoragePoolObjEndAPI(virStoragePoolObjPtr *obj) ...@@ -86,7 +101,9 @@ virStoragePoolObjEndAPI(virStoragePoolObjPtr *obj)
if (!*obj) if (!*obj)
return; return;
virStoragePoolObjUnlock(*obj); virObjectUnlock(*obj);
virObjectUnref(*obj);
*obj = NULL;
} }
...@@ -200,8 +217,10 @@ virStoragePoolObjDecrAsyncjobs(virStoragePoolObjPtr obj) ...@@ -200,8 +217,10 @@ virStoragePoolObjDecrAsyncjobs(virStoragePoolObjPtr obj)
void void
virStoragePoolObjFree(virStoragePoolObjPtr obj) virStoragePoolObjDispose(void *opaque)
{ {
virStoragePoolObjPtr obj = opaque;
if (!obj) if (!obj)
return; return;
...@@ -212,10 +231,6 @@ virStoragePoolObjFree(virStoragePoolObjPtr obj) ...@@ -212,10 +231,6 @@ virStoragePoolObjFree(virStoragePoolObjPtr obj)
VIR_FREE(obj->configFile); VIR_FREE(obj->configFile);
VIR_FREE(obj->autostartLink); VIR_FREE(obj->autostartLink);
virMutexDestroy(&obj->lock);
VIR_FREE(obj);
} }
...@@ -224,7 +239,7 @@ virStoragePoolObjListFree(virStoragePoolObjListPtr pools) ...@@ -224,7 +239,7 @@ virStoragePoolObjListFree(virStoragePoolObjListPtr pools)
{ {
size_t i; size_t i;
for (i = 0; i < pools->count; i++) for (i = 0; i < pools->count; i++)
virStoragePoolObjFree(pools->objs[i]); virObjectUnref(pools->objs[i]);
VIR_FREE(pools->objs); VIR_FREE(pools->objs);
pools->count = 0; pools->count = 0;
} }
...@@ -252,9 +267,9 @@ virStoragePoolObjListForEach(virStoragePoolObjListPtr pools, ...@@ -252,9 +267,9 @@ virStoragePoolObjListForEach(virStoragePoolObjListPtr pools,
for (i = 0; i < pools->count; i++) { for (i = 0; i < pools->count; i++) {
obj = pools->objs[i]; obj = pools->objs[i];
virStoragePoolObjLock(obj); virObjectLock(obj);
iter(obj, opaque); iter(obj, opaque);
virStoragePoolObjUnlock(obj); virObjectUnlock(obj);
} }
} }
...@@ -269,7 +284,7 @@ virStoragePoolObjListForEach(virStoragePoolObjListPtr pools, ...@@ -269,7 +284,7 @@ virStoragePoolObjListForEach(virStoragePoolObjListPtr pools,
* the @opaque data in order to find an object that matches some criteria * the @opaque data in order to find an object that matches some criteria
* and return that object locked. * and return that object locked.
* *
* Returns a locked object when found and NULL when not found * Returns a locked and reffed object when found and NULL when not found
*/ */
virStoragePoolObjPtr virStoragePoolObjPtr
virStoragePoolObjListSearch(virStoragePoolObjListPtr pools, virStoragePoolObjListSearch(virStoragePoolObjListPtr pools,
...@@ -281,10 +296,10 @@ virStoragePoolObjListSearch(virStoragePoolObjListPtr pools, ...@@ -281,10 +296,10 @@ virStoragePoolObjListSearch(virStoragePoolObjListPtr pools,
for (i = 0; i < pools->count; i++) { for (i = 0; i < pools->count; i++) {
obj = pools->objs[i]; obj = pools->objs[i];
virStoragePoolObjLock(obj); virObjectLock(obj);
if (searcher(obj, opaque)) if (searcher(obj, opaque))
return obj; return virObjectRef(obj);
virStoragePoolObjUnlock(obj); virObjectUnlock(obj);
} }
return NULL; return NULL;
...@@ -297,18 +312,18 @@ virStoragePoolObjRemove(virStoragePoolObjListPtr pools, ...@@ -297,18 +312,18 @@ virStoragePoolObjRemove(virStoragePoolObjListPtr pools,
{ {
size_t i; size_t i;
virStoragePoolObjUnlock(obj); virObjectUnlock(obj);
for (i = 0; i < pools->count; i++) { for (i = 0; i < pools->count; i++) {
virStoragePoolObjLock(pools->objs[i]); virObjectLock(pools->objs[i]);
if (pools->objs[i] == obj) { if (pools->objs[i] == obj) {
virStoragePoolObjUnlock(pools->objs[i]); virObjectUnlock(pools->objs[i]);
virStoragePoolObjFree(pools->objs[i]); virObjectUnref(pools->objs[i]);
VIR_DELETE_ELEMENT(pools->objs, i, pools->count); VIR_DELETE_ELEMENT(pools->objs, i, pools->count);
break; break;
} }
virStoragePoolObjUnlock(pools->objs[i]); virObjectUnlock(pools->objs[i]);
} }
} }
...@@ -320,10 +335,12 @@ virStoragePoolObjFindByUUID(virStoragePoolObjListPtr pools, ...@@ -320,10 +335,12 @@ virStoragePoolObjFindByUUID(virStoragePoolObjListPtr pools,
size_t i; size_t i;
for (i = 0; i < pools->count; i++) { for (i = 0; i < pools->count; i++) {
virStoragePoolObjLock(pools->objs[i]); virStoragePoolObjPtr obj = pools->objs[i];
if (!memcmp(pools->objs[i]->def->uuid, uuid, VIR_UUID_BUFLEN))
return pools->objs[i]; virObjectLock(obj);
virStoragePoolObjUnlock(pools->objs[i]); if (!memcmp(obj->def->uuid, uuid, VIR_UUID_BUFLEN))
return virObjectRef(obj);
virObjectUnlock(obj);
} }
return NULL; return NULL;
...@@ -337,10 +354,12 @@ virStoragePoolObjFindByName(virStoragePoolObjListPtr pools, ...@@ -337,10 +354,12 @@ virStoragePoolObjFindByName(virStoragePoolObjListPtr pools,
size_t i; size_t i;
for (i = 0; i < pools->count; i++) { for (i = 0; i < pools->count; i++) {
virStoragePoolObjLock(pools->objs[i]); virStoragePoolObjPtr obj = pools->objs[i];
if (STREQ(pools->objs[i]->def->name, name))
return pools->objs[i]; virObjectLock(obj);
virStoragePoolObjUnlock(pools->objs[i]); if (STREQ(obj->def->name, name))
return virObjectRef(obj);
virObjectUnlock(obj);
} }
return NULL; return NULL;
...@@ -608,13 +627,12 @@ virStoragePoolObjAssignDef(virStoragePoolObjListPtr pools, ...@@ -608,13 +627,12 @@ virStoragePoolObjAssignDef(virStoragePoolObjListPtr pools,
return NULL; return NULL;
if (VIR_APPEND_ELEMENT_COPY(pools->objs, pools->count, obj) < 0) { if (VIR_APPEND_ELEMENT_COPY(pools->objs, pools->count, obj) < 0) {
virStoragePoolObjUnlock(obj); virStoragePoolObjEndAPI(&obj);
virStoragePoolObjFree(obj);
return NULL; return NULL;
} }
obj->def = def; obj->def = def;
return obj; return virObjectRef(obj);
} }
...@@ -741,7 +759,7 @@ virStoragePoolObjLoadAllState(virStoragePoolObjListPtr pools, ...@@ -741,7 +759,7 @@ virStoragePoolObjLoadAllState(virStoragePoolObjListPtr pools,
if (!(obj = virStoragePoolObjLoadState(pools, stateDir, entry->d_name))) if (!(obj = virStoragePoolObjLoadState(pools, stateDir, entry->d_name)))
continue; continue;
virStoragePoolObjUnlock(obj); virStoragePoolObjEndAPI(&obj);
} }
VIR_DIR_CLOSE(dir); VIR_DIR_CLOSE(dir);
...@@ -780,8 +798,7 @@ virStoragePoolObjLoadAllConfigs(virStoragePoolObjListPtr pools, ...@@ -780,8 +798,7 @@ virStoragePoolObjLoadAllConfigs(virStoragePoolObjListPtr pools,
} }
obj = virStoragePoolObjLoad(pools, entry->d_name, path, autostartLink); obj = virStoragePoolObjLoad(pools, entry->d_name, path, autostartLink);
if (obj) virStoragePoolObjEndAPI(&obj);
virStoragePoolObjUnlock(obj);
VIR_FREE(path); VIR_FREE(path);
VIR_FREE(autostartLink); VIR_FREE(autostartLink);
...@@ -852,12 +869,12 @@ virStoragePoolObjNumOfStoragePools(virStoragePoolObjListPtr pools, ...@@ -852,12 +869,12 @@ virStoragePoolObjNumOfStoragePools(virStoragePoolObjListPtr pools,
for (i = 0; i < pools->count; i++) { for (i = 0; i < pools->count; i++) {
virStoragePoolObjPtr obj = pools->objs[i]; virStoragePoolObjPtr obj = pools->objs[i];
virStoragePoolObjLock(obj); virObjectLock(obj);
if (!filter || filter(conn, obj->def)) { if (!filter || filter(conn, obj->def)) {
if (wantActive == virStoragePoolObjIsActive(obj)) if (wantActive == virStoragePoolObjIsActive(obj))
npools++; npools++;
} }
virStoragePoolObjUnlock(obj); virObjectUnlock(obj);
} }
return npools; return npools;
...@@ -877,17 +894,17 @@ virStoragePoolObjGetNames(virStoragePoolObjListPtr pools, ...@@ -877,17 +894,17 @@ virStoragePoolObjGetNames(virStoragePoolObjListPtr pools,
for (i = 0; i < pools->count && nnames < maxnames; i++) { for (i = 0; i < pools->count && nnames < maxnames; i++) {
virStoragePoolObjPtr obj = pools->objs[i]; virStoragePoolObjPtr obj = pools->objs[i];
virStoragePoolObjLock(obj); virObjectLock(obj);
if (!filter || filter(conn, obj->def)) { if (!filter || filter(conn, obj->def)) {
if (wantActive == virStoragePoolObjIsActive(obj)) { if (wantActive == virStoragePoolObjIsActive(obj)) {
if (VIR_STRDUP(names[nnames], obj->def->name) < 0) { if (VIR_STRDUP(names[nnames], obj->def->name) < 0) {
virStoragePoolObjUnlock(obj); virObjectUnlock(obj);
goto failure; goto failure;
} }
nnames++; nnames++;
} }
} }
virStoragePoolObjUnlock(obj); virObjectUnlock(obj);
} }
return nnames; return nnames;
...@@ -957,8 +974,7 @@ virStoragePoolObjIsDuplicate(virStoragePoolObjListPtr pools, ...@@ -957,8 +974,7 @@ virStoragePoolObjIsDuplicate(virStoragePoolObjListPtr pools,
} }
cleanup: cleanup:
if (obj) virStoragePoolObjEndAPI(&obj);
virStoragePoolObjUnlock(obj);
return ret; return ret;
} }
...@@ -1273,7 +1289,7 @@ virStoragePoolObjSourceFindDuplicate(virConnectPtr conn, ...@@ -1273,7 +1289,7 @@ virStoragePoolObjSourceFindDuplicate(virConnectPtr conn,
if (STREQ(obj->def->name, def->name)) if (STREQ(obj->def->name, def->name))
continue; continue;
virStoragePoolObjLock(obj); virObjectLock(obj);
switch ((virStoragePoolType)obj->def->type) { switch ((virStoragePoolType)obj->def->type) {
case VIR_STORAGE_POOL_DIR: case VIR_STORAGE_POOL_DIR:
...@@ -1325,7 +1341,7 @@ virStoragePoolObjSourceFindDuplicate(virConnectPtr conn, ...@@ -1325,7 +1341,7 @@ virStoragePoolObjSourceFindDuplicate(virConnectPtr conn,
case VIR_STORAGE_POOL_LAST: case VIR_STORAGE_POOL_LAST:
break; break;
} }
virStoragePoolObjUnlock(obj); virObjectUnlock(obj);
if (matchobj) if (matchobj)
break; break;
...@@ -1341,20 +1357,6 @@ virStoragePoolObjSourceFindDuplicate(virConnectPtr conn, ...@@ -1341,20 +1357,6 @@ virStoragePoolObjSourceFindDuplicate(virConnectPtr conn,
} }
void
virStoragePoolObjLock(virStoragePoolObjPtr obj)
{
virMutexLock(&obj->lock);
}
static void
virStoragePoolObjUnlock(virStoragePoolObjPtr obj)
{
virMutexUnlock(&obj->lock);
}
#define MATCH(FLAG) (flags & (FLAG)) #define MATCH(FLAG) (flags & (FLAG))
static bool static bool
virStoragePoolMatch(virStoragePoolObjPtr obj, virStoragePoolMatch(virStoragePoolObjPtr obj,
...@@ -1438,7 +1440,7 @@ virStoragePoolObjListExport(virConnectPtr conn, ...@@ -1438,7 +1440,7 @@ virStoragePoolObjListExport(virConnectPtr conn,
for (i = 0; i < poolobjs->count; i++) { for (i = 0; i < poolobjs->count; i++) {
virStoragePoolObjPtr obj = poolobjs->objs[i]; virStoragePoolObjPtr obj = poolobjs->objs[i];
virStoragePoolObjLock(obj); virObjectLock(obj);
if ((!filter || filter(conn, obj->def)) && if ((!filter || filter(conn, obj->def)) &&
virStoragePoolMatch(obj, flags)) { virStoragePoolMatch(obj, flags)) {
if (pools) { if (pools) {
...@@ -1446,14 +1448,14 @@ virStoragePoolObjListExport(virConnectPtr conn, ...@@ -1446,14 +1448,14 @@ virStoragePoolObjListExport(virConnectPtr conn,
obj->def->name, obj->def->name,
obj->def->uuid, obj->def->uuid,
NULL, NULL))) { NULL, NULL))) {
virStoragePoolObjUnlock(obj); virObjectUnlock(obj);
goto cleanup; goto cleanup;
} }
tmp_pools[npools] = pool; tmp_pools[npools] = pool;
} }
npools++; npools++;
} }
virStoragePoolObjUnlock(obj); virObjectUnlock(obj);
} }
if (tmp_pools) { if (tmp_pools) {
......
...@@ -258,9 +258,6 @@ virStoragePoolObjSourceFindDuplicate(virConnectPtr conn, ...@@ -258,9 +258,6 @@ virStoragePoolObjSourceFindDuplicate(virConnectPtr conn,
virStoragePoolObjListPtr pools, virStoragePoolObjListPtr pools,
virStoragePoolDefPtr def); virStoragePoolDefPtr def);
void
virStoragePoolObjLock(virStoragePoolObjPtr obj);
int int
virStoragePoolObjListExport(virConnectPtr conn, virStoragePoolObjListExport(virConnectPtr conn,
virStoragePoolObjListPtr poolobjs, virStoragePoolObjListPtr poolobjs,
......
...@@ -1095,7 +1095,6 @@ virStoragePoolObjListFree; ...@@ -1095,7 +1095,6 @@ virStoragePoolObjListFree;
virStoragePoolObjListSearch; virStoragePoolObjListSearch;
virStoragePoolObjLoadAllConfigs; virStoragePoolObjLoadAllConfigs;
virStoragePoolObjLoadAllState; virStoragePoolObjLoadAllState;
virStoragePoolObjLock;
virStoragePoolObjNew; virStoragePoolObjNew;
virStoragePoolObjNumOfStoragePools; virStoragePoolObjNumOfStoragePools;
virStoragePoolObjNumOfVolumes; virStoragePoolObjNumOfVolumes;
......
...@@ -1760,7 +1760,6 @@ virStorageVolDefFromVol(virStorageVolPtr vol, ...@@ -1760,7 +1760,6 @@ virStorageVolDefFromVol(virStorageVolPtr vol,
error: error:
virStoragePoolObjEndAPI(obj); virStoragePoolObjEndAPI(obj);
*obj = NULL;
return NULL; return NULL;
} }
...@@ -1893,14 +1892,14 @@ storageVolCreateXML(virStoragePoolPtr pool, ...@@ -1893,14 +1892,14 @@ storageVolCreateXML(virStoragePoolPtr pool,
/* Drop the pool lock during volume allocation */ /* Drop the pool lock during volume allocation */
virStoragePoolObjIncrAsyncjobs(obj); virStoragePoolObjIncrAsyncjobs(obj);
voldef->building = true; voldef->building = true;
virStoragePoolObjEndAPI(&obj); virObjectUnlock(obj);
buildret = backend->buildVol(pool->conn, obj, buildvoldef, flags); buildret = backend->buildVol(pool->conn, obj, buildvoldef, flags);
VIR_FREE(buildvoldef); VIR_FREE(buildvoldef);
storageDriverLock(); storageDriverLock();
virStoragePoolObjLock(obj); virObjectLock(obj);
storageDriverUnlock(); storageDriverUnlock();
voldef->building = false; voldef->building = false;
...@@ -1968,9 +1967,9 @@ storageVolCreateXMLFrom(virStoragePoolPtr pool, ...@@ -1968,9 +1967,9 @@ storageVolCreateXMLFrom(virStoragePoolPtr pool,
storageDriverLock(); storageDriverLock();
obj = virStoragePoolObjFindByUUID(&driver->pools, pool->uuid); obj = virStoragePoolObjFindByUUID(&driver->pools, pool->uuid);
if (obj && STRNEQ(pool->name, volsrc->pool)) { if (obj && STRNEQ(pool->name, volsrc->pool)) {
virStoragePoolObjEndAPI(&obj); virObjectUnlock(obj);
objsrc = virStoragePoolObjFindByName(&driver->pools, volsrc->pool); objsrc = virStoragePoolObjFindByName(&driver->pools, volsrc->pool);
virStoragePoolObjLock(obj); virObjectLock(obj);
} }
storageDriverUnlock(); storageDriverUnlock();
if (!obj) { if (!obj) {
...@@ -2089,19 +2088,19 @@ storageVolCreateXMLFrom(virStoragePoolPtr pool, ...@@ -2089,19 +2088,19 @@ storageVolCreateXMLFrom(virStoragePoolPtr pool,
virStoragePoolObjIncrAsyncjobs(obj); virStoragePoolObjIncrAsyncjobs(obj);
voldef->building = true; voldef->building = true;
voldefsrc->in_use++; voldefsrc->in_use++;
virStoragePoolObjEndAPI(&obj); virObjectUnlock(obj);
if (objsrc) { if (objsrc) {
virStoragePoolObjIncrAsyncjobs(objsrc); virStoragePoolObjIncrAsyncjobs(objsrc);
virStoragePoolObjEndAPI(&objsrc); virObjectUnlock(objsrc);
} }
buildret = backend->buildVolFrom(pool->conn, obj, shadowvol, voldefsrc, flags); buildret = backend->buildVolFrom(pool->conn, obj, shadowvol, voldefsrc, flags);
storageDriverLock(); storageDriverLock();
virStoragePoolObjLock(obj); virObjectLock(obj);
if (objsrc) if (objsrc)
virStoragePoolObjLock(objsrc); virObjectLock(objsrc);
storageDriverUnlock(); storageDriverUnlock();
voldefsrc->in_use--; voldefsrc->in_use--;
...@@ -2111,7 +2110,6 @@ storageVolCreateXMLFrom(virStoragePoolPtr pool, ...@@ -2111,7 +2110,6 @@ storageVolCreateXMLFrom(virStoragePoolPtr pool,
if (objsrc) { if (objsrc) {
virStoragePoolObjDecrAsyncjobs(objsrc); virStoragePoolObjDecrAsyncjobs(objsrc);
virStoragePoolObjEndAPI(&objsrc); virStoragePoolObjEndAPI(&objsrc);
objsrc = NULL;
} }
if (buildret < 0 || if (buildret < 0 ||
......
...@@ -111,7 +111,6 @@ testCompareXMLToArgvFiles(bool shouldFail, ...@@ -111,7 +111,6 @@ testCompareXMLToArgvFiles(bool shouldFail,
virCommandFree(cmd); virCommandFree(cmd);
VIR_FREE(actualCmdline); VIR_FREE(actualCmdline);
virStoragePoolObjEndAPI(&obj); virStoragePoolObjEndAPI(&obj);
virStoragePoolObjFree(obj);
virObjectUnref(conn); virObjectUnref(conn);
return ret; return ret;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册