#define VIR_DOMAIN_XML_WRITE_FLAGS VIR_DOMAIN_XML_SECURE
#define VIR_DOMAIN_XML_READ_FLAGS VIR_DOMAIN_XML_INACTIVE
+struct _virDomainSnapshotObjList {
+ /* name string -> virDomainSnapshotObj mapping
+ * for O(1), lockless lookup-by-name */
+ virHashTable *objs;
+
+ virDomainSnapshotObj metaroot; /* Special parent of all root snapshots */
+};
+
+
static virClassPtr virDomainObjClass;
static void virDomainObjDispose(void *obj);
VIR_FREE(def);
}
-static void virDomainSnapshotObjListDeinit(virDomainSnapshotObjListPtr snapshots);
-
static void virDomainObjDispose(void *obj)
{
virDomainObjPtr dom = obj;
virMutexDestroy(&dom->lock);
- virDomainSnapshotObjListDeinit(&dom->snapshots);
+ virDomainSnapshotObjListFree(dom->snapshots);
}
if (!(domain = virObjectNew(virDomainObjClass)))
return NULL;
- if (caps->privateDataAllocFunc &&
- !(domain->privateData = (caps->privateDataAllocFunc)())) {
- virReportOOMError();
- VIR_FREE(domain);
- return NULL;
- }
- domain->privateDataFreeFunc = caps->privateDataFreeFunc;
-
if (virMutexInit(&domain->lock) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
"%s", _("cannot initialize mutex"));
- if (domain->privateDataFreeFunc)
- (domain->privateDataFreeFunc)(domain->privateData);
VIR_FREE(domain);
return NULL;
}
+ if (caps->privateDataAllocFunc &&
+ !(domain->privateData = (caps->privateDataAllocFunc)())) {
+ virReportOOMError();
+ goto error;
+ }
+ domain->privateDataFreeFunc = caps->privateDataFreeFunc;
+
+ if (!(domain->snapshots = virDomainSnapshotObjListNew()))
+ goto error;
+
virDomainObjLock(domain);
virDomainObjSetState(domain, VIR_DOMAIN_SHUTOFF,
VIR_DOMAIN_SHUTOFF_UNKNOWN);
- virDomainSnapshotObjListInit(&domain->snapshots);
-
VIR_DEBUG("obj=%p", domain);
return domain;
+
+error:
+ virObjectUnref(domain);
+ return NULL;
}
void virDomainObjAssignDef(virDomainObjPtr domain,
virDomainSnapshotObjFree(obj);
}
-int virDomainSnapshotObjListInit(virDomainSnapshotObjListPtr snapshots)
+virDomainSnapshotObjListPtr
+virDomainSnapshotObjListNew(void)
{
+ virDomainSnapshotObjListPtr snapshots;
+ if (VIR_ALLOC(snapshots) < 0) {
+ virReportOOMError();
+ return NULL;
+ }
snapshots->objs = virHashCreate(50, virDomainSnapshotObjListDataFree);
- if (!snapshots->objs)
- return -1;
- return 0;
+ if (!snapshots->objs) {
+ VIR_FREE(snapshots);
+ return NULL;
+ }
+ return snapshots;
}
-static void
-virDomainSnapshotObjListDeinit(virDomainSnapshotObjListPtr snapshots)
+void
+virDomainSnapshotObjListFree(virDomainSnapshotObjListPtr snapshots)
{
+ if (!snapshots)
+ return;
virHashFree(snapshots->objs);
+ VIR_FREE(snapshots);
}
struct virDomainSnapshotNameData {
virHashRemoveEntry(snapshots->objs, snapshot->def->name);
}
+int
+virDomainSnapshotForEach(virDomainSnapshotObjListPtr snapshots,
+ virHashIterator iter,
+ void *data)
+{
+ return virHashForEach(snapshots->objs, iter, data);
+}
+
/* Run iter(data) on all direct children of snapshot, while ignoring all
* other entries in snapshots. Return the number of children
* visited. No particular ordering is guaranteed. */
/* filter by snapshot existence */
if (MATCH(VIR_CONNECT_LIST_DOMAINS_FILTERS_SNAPSHOT)) {
- int nsnap = virDomainSnapshotObjListNum(&vm->snapshots, NULL, 0);
+ int nsnap = virDomainSnapshotObjListNum(vm->snapshots, NULL, 0);
if (!((MATCH(VIR_CONNECT_LIST_DOMAINS_HAS_SNAPSHOT) && nsnap > 0) ||
(MATCH(VIR_CONNECT_LIST_DOMAINS_NO_SNAPSHOT) && nsnap <= 0)))
goto cleanup;
typedef struct _virDomainSnapshotObjList virDomainSnapshotObjList;
typedef virDomainSnapshotObjList *virDomainSnapshotObjListPtr;
-struct _virDomainSnapshotObjList {
- /* name string -> virDomainSnapshotObj mapping
- * for O(1), lockless lookup-by-name */
- virHashTable *objs;
- virDomainSnapshotObj metaroot; /* Special parent of all root snapshots */
-};
+virDomainSnapshotObjListPtr virDomainSnapshotObjListNew(void);
+void virDomainSnapshotObjListFree(virDomainSnapshotObjListPtr snapshots);
typedef enum {
VIR_DOMAIN_SNAPSHOT_PARSE_REDEFINE = 1 << 0,
virDomainSnapshotObjPtr virDomainSnapshotAssignDef(virDomainSnapshotObjListPtr snapshots,
const virDomainSnapshotDefPtr def);
-int virDomainSnapshotObjListInit(virDomainSnapshotObjListPtr objs);
int virDomainSnapshotObjListGetNames(virDomainSnapshotObjListPtr snapshots,
virDomainSnapshotObjPtr from,
char **const names, int maxnames,
const char *name);
void virDomainSnapshotObjListRemove(virDomainSnapshotObjListPtr snapshots,
virDomainSnapshotObjPtr snapshot);
+int virDomainSnapshotForEach(virDomainSnapshotObjListPtr snapshots,
+ virHashIterator iter,
+ void *data);
int virDomainSnapshotForEachChild(virDomainSnapshotObjPtr snapshot,
virHashIterator iter,
void *data);
virDomainDefPtr def; /* The current definition */
virDomainDefPtr newDef; /* New definition to activate at shutdown */
- virDomainSnapshotObjList snapshots;
+ virDomainSnapshotObjListPtr snapshots;
virDomainSnapshotObjPtr current_snapshot;
bool hasManagedSave;
continue;
}
- snap = virDomainSnapshotAssignDef(&vm->snapshots, def);
+ snap = virDomainSnapshotAssignDef(vm->snapshots, def);
if (snap == NULL) {
virDomainSnapshotDefFree(def);
} else if (snap->def->current) {
vm->current_snapshot = NULL;
}
- if (virDomainSnapshotUpdateRelations(&vm->snapshots) < 0)
+ if (virDomainSnapshotUpdateRelations(vm->snapshots) < 0)
VIR_ERROR(_("Snapshots have inconsistent relations for domain %s"),
vm->def->name);
}
if (!virDomainObjIsActive(vm) &&
- (nsnapshots = virDomainSnapshotObjListNum(&vm->snapshots, NULL, 0))) {
+ (nsnapshots = virDomainSnapshotObjListNum(vm->snapshots, NULL, 0))) {
if (!(flags & VIR_DOMAIN_UNDEFINE_SNAPSHOTS_METADATA)) {
virReportError(VIR_ERR_OPERATION_INVALID,
_("cannot delete inactive domain with %d "
def->name);
goto cleanup;
}
- other = virDomainSnapshotFindByName(&vm->snapshots, def->parent);
+ other = virDomainSnapshotFindByName(vm->snapshots, def->parent);
if (!other) {
virReportError(VIR_ERR_INVALID_ARG,
_("parent %s for snapshot %s not found"),
other->def->name, def->name);
goto cleanup;
}
- other = virDomainSnapshotFindByName(&vm->snapshots,
+ other = virDomainSnapshotFindByName(vm->snapshots,
other->def->parent);
if (!other) {
VIR_WARN("snapshots are inconsistent for %s",
def->name, uuidstr);
goto cleanup;
}
- other = virDomainSnapshotFindByName(&vm->snapshots, def->name);
+ other = virDomainSnapshotFindByName(vm->snapshots, def->name);
if (other) {
if ((other->def->state == VIR_DOMAIN_RUNNING ||
other->def->state == VIR_DOMAIN_PAUSED) !=
if (snap)
snap->def = def;
- else if (!(snap = virDomainSnapshotAssignDef(&vm->snapshots, def)))
+ else if (!(snap = virDomainSnapshotAssignDef(vm->snapshots, def)))
goto cleanup;
def = NULL;
} else {
if (update_current)
vm->current_snapshot = snap;
- other = virDomainSnapshotFindByName(&vm->snapshots,
+ other = virDomainSnapshotFindByName(vm->snapshots,
snap->def->parent);
snap->parent = other;
other->nchildren++;
other->first_child = snap;
}
} else if (snap) {
- virDomainSnapshotObjListRemove(&vm->snapshots, snap);
+ virDomainSnapshotObjListRemove(vm->snapshots, snap);
}
virDomainObjUnlock(vm);
}
goto cleanup;
}
- n = virDomainSnapshotObjListGetNames(&vm->snapshots, NULL, names, nameslen,
+ n = virDomainSnapshotObjListGetNames(vm->snapshots, NULL, names, nameslen,
flags);
cleanup:
goto cleanup;
}
- n = virDomainSnapshotObjListNum(&vm->snapshots, NULL, flags);
+ n = virDomainSnapshotObjListNum(vm->snapshots, NULL, flags);
cleanup:
if (vm)
goto cleanup;
}
- n = virDomainListSnapshots(&vm->snapshots, NULL, domain, snaps, flags);
+ n = virDomainListSnapshots(vm->snapshots, NULL, domain, snaps, flags);
cleanup:
if (vm)
goto cleanup;
}
- snap = virDomainSnapshotFindByName(&vm->snapshots, snapshot->name);
+ snap = virDomainSnapshotFindByName(vm->snapshots, snapshot->name);
if (!snap) {
virReportError(VIR_ERR_NO_DOMAIN_SNAPSHOT,
_("no domain snapshot with matching name '%s'"),
goto cleanup;
}
- n = virDomainSnapshotObjListGetNames(&vm->snapshots, snap, names, nameslen,
+ n = virDomainSnapshotObjListGetNames(vm->snapshots, snap, names, nameslen,
flags);
cleanup:
goto cleanup;
}
- snap = virDomainSnapshotFindByName(&vm->snapshots, snapshot->name);
+ snap = virDomainSnapshotFindByName(vm->snapshots, snapshot->name);
if (!snap) {
virReportError(VIR_ERR_NO_DOMAIN_SNAPSHOT,
_("no domain snapshot with matching name '%s'"),
goto cleanup;
}
- n = virDomainSnapshotObjListNum(&vm->snapshots, snap, flags);
+ n = virDomainSnapshotObjListNum(vm->snapshots, snap, flags);
cleanup:
if (vm)
goto cleanup;
}
- snap = virDomainSnapshotFindByName(&vm->snapshots, snapshot->name);
+ snap = virDomainSnapshotFindByName(vm->snapshots, snapshot->name);
if (!snap) {
virReportError(VIR_ERR_NO_DOMAIN_SNAPSHOT,
_("no domain snapshot with matching name '%s'"),
goto cleanup;
}
- n = virDomainListSnapshots(&vm->snapshots, snap, snapshot->domain, snaps,
+ n = virDomainListSnapshots(vm->snapshots, snap, snapshot->domain, snaps,
flags);
cleanup:
goto cleanup;
}
- snap = virDomainSnapshotFindByName(&vm->snapshots, name);
+ snap = virDomainSnapshotFindByName(vm->snapshots, name);
if (!snap) {
virReportError(VIR_ERR_NO_DOMAIN_SNAPSHOT,
_("no snapshot with matching name '%s'"), name);
goto cleanup;
}
- snap = virDomainSnapshotFindByName(&vm->snapshots, snapshot->name);
+ snap = virDomainSnapshotFindByName(vm->snapshots, snapshot->name);
if (!snap) {
virReportError(VIR_ERR_NO_DOMAIN_SNAPSHOT,
_("no domain snapshot with matching name '%s'"),
goto cleanup;
}
- snap = virDomainSnapshotFindByName(&vm->snapshots, snapshot->name);
+ snap = virDomainSnapshotFindByName(vm->snapshots, snapshot->name);
if (!snap) {
virReportError(VIR_ERR_NO_DOMAIN_SNAPSHOT,
_("no domain snapshot with matching name '%s'"),
goto cleanup;
}
- snap = virDomainSnapshotFindByName(&vm->snapshots, snapshot->name);
+ snap = virDomainSnapshotFindByName(vm->snapshots, snapshot->name);
if (!snap) {
virReportError(VIR_ERR_NO_DOMAIN_SNAPSHOT,
_("no domain snapshot with matching name '%s'"),
goto cleanup;
}
- snap = virDomainSnapshotFindByName(&vm->snapshots, snapshot->name);
+ snap = virDomainSnapshotFindByName(vm->snapshots, snapshot->name);
if (!snap) {
virReportError(VIR_ERR_NO_DOMAIN_SNAPSHOT,
_("no domain snapshot with matching name '%s'"),
goto cleanup;
}
- snap = virDomainSnapshotFindByName(&vm->snapshots, snapshot->name);
+ snap = virDomainSnapshotFindByName(vm->snapshots, snapshot->name);
if (!snap) {
virReportError(VIR_ERR_NO_DOMAIN_SNAPSHOT,
_("no domain snapshot with matching name '%s'"),
goto cleanup;
}
- snap = virDomainSnapshotFindByName(&vm->snapshots, snapshot->name);
+ snap = virDomainSnapshotFindByName(vm->snapshots, snapshot->name);
if (!snap) {
virReportError(VIR_ERR_NO_DOMAIN_SNAPSHOT,
_("no domain snapshot with matching name '%s'"),