VIR_LOG_INIT("conf.virstorageobj");
+static virClassPtr virStoragePoolObjClass;
+
static void
-virStoragePoolObjUnlock(virStoragePoolObjPtr obj);
+virStoragePoolObjDispose(void *opaque);
struct _virStorageVolDefList {
};
struct _virStoragePoolObj {
- virMutex lock;
+ virObjectLockable parent;
char *configFile;
char *autostartLink;
virStorageVolDefList volumes;
};
+
+static int
+virStoragePoolObjOnceInit(void)
+{
+ if (!(virStoragePoolObjClass = virClassNew(virClassForObjectLockable(),
+ "virStoragePoolObj",
+ sizeof(virStoragePoolObj),
+ virStoragePoolObjDispose)))
+ return -1;
+
+ return 0;
+}
+
+VIR_ONCE_GLOBAL_INIT(virStoragePoolObj)
+
+
virStoragePoolObjPtr
virStoragePoolObjNew(void)
{
virStoragePoolObjPtr obj;
- if (VIR_ALLOC(obj) < 0)
+ if (virStoragePoolObjInitialize() < 0)
return NULL;
- if (virMutexInit(&obj->lock) < 0) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("cannot initialize mutex"));
- VIR_FREE(obj);
+ if (!(obj = virObjectLockableNew(virStoragePoolObjClass)))
return NULL;
- }
- virStoragePoolObjLock(obj);
+
+ virObjectLock(obj);
obj->active = false;
return obj;
}
if (!*obj)
return;
- virStoragePoolObjUnlock(*obj);
+ virObjectUnlock(*obj);
+ virObjectUnref(*obj);
+ *obj = NULL;
}
void
-virStoragePoolObjFree(virStoragePoolObjPtr obj)
+virStoragePoolObjDispose(void *opaque)
{
+ virStoragePoolObjPtr obj = opaque;
+
if (!obj)
return;
VIR_FREE(obj->configFile);
VIR_FREE(obj->autostartLink);
-
- virMutexDestroy(&obj->lock);
-
- VIR_FREE(obj);
}
{
size_t i;
for (i = 0; i < pools->count; i++)
- virStoragePoolObjFree(pools->objs[i]);
+ virObjectUnref(pools->objs[i]);
VIR_FREE(pools->objs);
pools->count = 0;
}
for (i = 0; i < pools->count; i++) {
obj = pools->objs[i];
- virStoragePoolObjLock(obj);
+ virObjectLock(obj);
iter(obj, opaque);
- virStoragePoolObjUnlock(obj);
+ virObjectUnlock(obj);
}
}
* the @opaque data in order to find an object that matches some criteria
* 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
virStoragePoolObjListSearch(virStoragePoolObjListPtr pools,
for (i = 0; i < pools->count; i++) {
obj = pools->objs[i];
- virStoragePoolObjLock(obj);
+ virObjectLock(obj);
if (searcher(obj, opaque))
- return obj;
- virStoragePoolObjUnlock(obj);
+ return virObjectRef(obj);
+ virObjectUnlock(obj);
}
return NULL;
{
size_t i;
- virStoragePoolObjUnlock(obj);
+ virObjectUnlock(obj);
for (i = 0; i < pools->count; i++) {
- virStoragePoolObjLock(pools->objs[i]);
+ virObjectLock(pools->objs[i]);
if (pools->objs[i] == obj) {
- virStoragePoolObjUnlock(pools->objs[i]);
- virStoragePoolObjFree(pools->objs[i]);
+ virObjectUnlock(pools->objs[i]);
+ virObjectUnref(pools->objs[i]);
VIR_DELETE_ELEMENT(pools->objs, i, pools->count);
break;
}
- virStoragePoolObjUnlock(pools->objs[i]);
+ virObjectUnlock(pools->objs[i]);
}
}
size_t i;
for (i = 0; i < pools->count; i++) {
- virStoragePoolObjLock(pools->objs[i]);
- if (!memcmp(pools->objs[i]->def->uuid, uuid, VIR_UUID_BUFLEN))
- return pools->objs[i];
- virStoragePoolObjUnlock(pools->objs[i]);
+ virStoragePoolObjPtr obj = pools->objs[i];
+
+ virObjectLock(obj);
+ if (!memcmp(obj->def->uuid, uuid, VIR_UUID_BUFLEN))
+ return virObjectRef(obj);
+ virObjectUnlock(obj);
}
return NULL;
size_t i;
for (i = 0; i < pools->count; i++) {
- virStoragePoolObjLock(pools->objs[i]);
- if (STREQ(pools->objs[i]->def->name, name))
- return pools->objs[i];
- virStoragePoolObjUnlock(pools->objs[i]);
+ virStoragePoolObjPtr obj = pools->objs[i];
+
+ virObjectLock(obj);
+ if (STREQ(obj->def->name, name))
+ return virObjectRef(obj);
+ virObjectUnlock(obj);
}
return NULL;
return NULL;
if (VIR_APPEND_ELEMENT_COPY(pools->objs, pools->count, obj) < 0) {
- virStoragePoolObjUnlock(obj);
- virStoragePoolObjFree(obj);
+ virStoragePoolObjEndAPI(&obj);
return NULL;
}
obj->def = def;
- return obj;
+ return virObjectRef(obj);
}
if (!(obj = virStoragePoolObjLoadState(pools, stateDir, entry->d_name)))
continue;
- virStoragePoolObjUnlock(obj);
+ virStoragePoolObjEndAPI(&obj);
}
VIR_DIR_CLOSE(dir);
}
obj = virStoragePoolObjLoad(pools, entry->d_name, path, autostartLink);
- if (obj)
- virStoragePoolObjUnlock(obj);
+ virStoragePoolObjEndAPI(&obj);
VIR_FREE(path);
VIR_FREE(autostartLink);
for (i = 0; i < pools->count; i++) {
virStoragePoolObjPtr obj = pools->objs[i];
- virStoragePoolObjLock(obj);
+ virObjectLock(obj);
if (!filter || filter(conn, obj->def)) {
if (wantActive == virStoragePoolObjIsActive(obj))
npools++;
}
- virStoragePoolObjUnlock(obj);
+ virObjectUnlock(obj);
}
return npools;
for (i = 0; i < pools->count && nnames < maxnames; i++) {
virStoragePoolObjPtr obj = pools->objs[i];
- virStoragePoolObjLock(obj);
+ virObjectLock(obj);
if (!filter || filter(conn, obj->def)) {
if (wantActive == virStoragePoolObjIsActive(obj)) {
if (VIR_STRDUP(names[nnames], obj->def->name) < 0) {
- virStoragePoolObjUnlock(obj);
+ virObjectUnlock(obj);
goto failure;
}
nnames++;
}
}
- virStoragePoolObjUnlock(obj);
+ virObjectUnlock(obj);
}
return nnames;
}
cleanup:
- if (obj)
- virStoragePoolObjUnlock(obj);
+ virStoragePoolObjEndAPI(&obj);
return ret;
}
if (STREQ(obj->def->name, def->name))
continue;
- virStoragePoolObjLock(obj);
+ virObjectLock(obj);
switch ((virStoragePoolType)obj->def->type) {
case VIR_STORAGE_POOL_DIR:
case VIR_STORAGE_POOL_LAST:
break;
}
- virStoragePoolObjUnlock(obj);
+ virObjectUnlock(obj);
if (matchobj)
break;
}
-void
-virStoragePoolObjLock(virStoragePoolObjPtr obj)
-{
- virMutexLock(&obj->lock);
-}
-
-
-static void
-virStoragePoolObjUnlock(virStoragePoolObjPtr obj)
-{
- virMutexUnlock(&obj->lock);
-}
-
-
#define MATCH(FLAG) (flags & (FLAG))
static bool
virStoragePoolMatch(virStoragePoolObjPtr obj,
for (i = 0; i < poolobjs->count; i++) {
virStoragePoolObjPtr obj = poolobjs->objs[i];
- virStoragePoolObjLock(obj);
+ virObjectLock(obj);
if ((!filter || filter(conn, obj->def)) &&
virStoragePoolMatch(obj, flags)) {
if (pools) {
obj->def->name,
obj->def->uuid,
NULL, NULL))) {
- virStoragePoolObjUnlock(obj);
+ virObjectUnlock(obj);
goto cleanup;
}
tmp_pools[npools] = pool;
}
npools++;
}
- virStoragePoolObjUnlock(obj);
+ virObjectUnlock(obj);
}
if (tmp_pools) {
error:
virStoragePoolObjEndAPI(obj);
- *obj = NULL;
return NULL;
}
/* Drop the pool lock during volume allocation */
virStoragePoolObjIncrAsyncjobs(obj);
voldef->building = true;
- virStoragePoolObjEndAPI(&obj);
+ virObjectUnlock(obj);
buildret = backend->buildVol(pool->conn, obj, buildvoldef, flags);
VIR_FREE(buildvoldef);
storageDriverLock();
- virStoragePoolObjLock(obj);
+ virObjectLock(obj);
storageDriverUnlock();
voldef->building = false;
storageDriverLock();
obj = virStoragePoolObjFindByUUID(&driver->pools, pool->uuid);
if (obj && STRNEQ(pool->name, volsrc->pool)) {
- virStoragePoolObjEndAPI(&obj);
+ virObjectUnlock(obj);
objsrc = virStoragePoolObjFindByName(&driver->pools, volsrc->pool);
- virStoragePoolObjLock(obj);
+ virObjectLock(obj);
}
storageDriverUnlock();
if (!obj) {
virStoragePoolObjIncrAsyncjobs(obj);
voldef->building = true;
voldefsrc->in_use++;
- virStoragePoolObjEndAPI(&obj);
+ virObjectUnlock(obj);
if (objsrc) {
virStoragePoolObjIncrAsyncjobs(objsrc);
- virStoragePoolObjEndAPI(&objsrc);
+ virObjectUnlock(objsrc);
}
buildret = backend->buildVolFrom(pool->conn, obj, shadowvol, voldefsrc, flags);
storageDriverLock();
- virStoragePoolObjLock(obj);
+ virObjectLock(obj);
if (objsrc)
- virStoragePoolObjLock(objsrc);
+ virObjectLock(objsrc);
storageDriverUnlock();
voldefsrc->in_use--;
if (objsrc) {
virStoragePoolObjDecrAsyncjobs(objsrc);
virStoragePoolObjEndAPI(&objsrc);
- objsrc = NULL;
}
if (buildret < 0 ||