1 /* 2 * virdomainmomentobjlist.h: handle a tree of moment objects 3 * (derived from snapshot_conf.h) 4 * 5 * Copyright (C) 2006-2019 Red Hat, Inc. 6 * Copyright (C) 2006-2008 Daniel P. Berrange 7 * 8 * This library is free software; you can redistribute it and/or 9 * modify it under the terms of the GNU Lesser General Public 10 * License as published by the Free Software Foundation; either 11 * version 2.1 of the License, or (at your option) any later version. 12 * 13 * This library is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16 * Lesser General Public License for more details. 17 * 18 * You should have received a copy of the GNU Lesser General Public 19 * License along with this library. If not, see 20 * <http://www.gnu.org/licenses/>. 21 */ 22 23 #pragma once 24 25 #include "internal.h" 26 #include "virconftypes.h" 27 #include "virhash.h" 28 29 /* Filter that returns true if a given moment matches the filter flags */ 30 typedef bool (*virDomainMomentObjListFilter)(virDomainMomentObj *obj, 31 unsigned int flags); 32 33 /* Struct that allows tracing hierarchical relationships between 34 * multiple virDomainMoment objects. The opaque type 35 * virDomainMomentObjList then maintains both a hash of these structs 36 * (for quick lookup by name) and a metaroot (which is the parent of 37 * all user-visible roots), so that all other objects always have a 38 * valid parent object; the tree structure is currently maintained via 39 * a linked list. */ 40 struct _virDomainMomentObj { 41 /* Public field */ 42 virDomainMomentDef *def; /* non-NULL except for metaroot */ 43 44 /* Private fields, use accessors instead */ 45 virDomainMomentObj *parent; /* non-NULL except for metaroot, before 46 virDomainMomentUpdateRelations, or 47 after virDomainMomentDropParent */ 48 virDomainMomentObj *sibling; /* NULL if last child of parent */ 49 size_t nchildren; 50 virDomainMomentObj *first_child; /* NULL if no children */ 51 }; 52 53 int virDomainMomentForEachChild(virDomainMomentObj *moment, 54 virHashIterator iter, 55 void *data); 56 int virDomainMomentForEachDescendant(virDomainMomentObj *moment, 57 virHashIterator iter, 58 void *data); 59 void virDomainMomentDropParent(virDomainMomentObj *moment); 60 void virDomainMomentDropChildren(virDomainMomentObj *moment); 61 void virDomainMomentMoveChildren(virDomainMomentObj *from, 62 virDomainMomentObj *to); 63 void virDomainMomentLinkParent(virDomainMomentObjList *moments, 64 virDomainMomentObj *moment); 65 66 virDomainMomentObjList *virDomainMomentObjListNew(void); 67 void virDomainMomentObjListFree(virDomainMomentObjList *moments); 68 69 virDomainMomentObj *virDomainMomentAssignDef(virDomainMomentObjList *moments, 70 virDomainMomentDef *def); 71 72 /* Various enum bits that map to public API filters. Note that the 73 * values of the internal bits are not the same as the public ones for 74 * snapshot, however, this list should be kept in sync with the public 75 * ones for checkpoint. */ 76 typedef enum { 77 VIR_DOMAIN_MOMENT_LIST_ROOTS = (1 << 0), 78 VIR_DOMAIN_MOMENT_LIST_DESCENDANTS = (1 << 0), 79 VIR_DOMAIN_MOMENT_LIST_TOPOLOGICAL = (1 << 1), 80 VIR_DOMAIN_MOMENT_LIST_LEAVES = (1 << 2), 81 VIR_DOMAIN_MOMENT_LIST_NO_LEAVES = (1 << 3), 82 VIR_DOMAIN_MOMENT_LIST_METADATA = (1 << 4), 83 VIR_DOMAIN_MOMENT_LIST_NO_METADATA = (1 << 5), 84 } virDomainMomentFilters; 85 86 #define VIR_DOMAIN_MOMENT_FILTERS_METADATA \ 87 (VIR_DOMAIN_MOMENT_LIST_METADATA | \ 88 VIR_DOMAIN_MOMENT_LIST_NO_METADATA) 89 90 #define VIR_DOMAIN_MOMENT_FILTERS_LEAVES \ 91 (VIR_DOMAIN_MOMENT_LIST_LEAVES | \ 92 VIR_DOMAIN_MOMENT_LIST_NO_LEAVES) 93 94 #define VIR_DOMAIN_MOMENT_FILTERS_ALL \ 95 (VIR_DOMAIN_MOMENT_LIST_ROOTS | \ 96 VIR_DOMAIN_MOMENT_LIST_TOPOLOGICAL | \ 97 VIR_DOMAIN_MOMENT_FILTERS_METADATA | \ 98 VIR_DOMAIN_MOMENT_FILTERS_LEAVES) 99 100 int virDomainMomentObjListGetNames(virDomainMomentObjList *moments, 101 virDomainMomentObj *from, 102 char **const names, 103 int maxnames, 104 unsigned int moment_flags, 105 virDomainMomentObjListFilter filter, 106 unsigned int filter_flags); 107 virDomainMomentObj *virDomainMomentFindByName(virDomainMomentObjList *moments, 108 const char *name); 109 int virDomainMomentObjListSize(virDomainMomentObjList *moments); 110 virDomainMomentObj *virDomainMomentGetCurrent(virDomainMomentObjList *moments); 111 const char *virDomainMomentGetCurrentName(virDomainMomentObjList *moments); 112 void virDomainMomentSetCurrent(virDomainMomentObjList *moments, 113 virDomainMomentObj *moment); 114 bool virDomainMomentObjListRemove(virDomainMomentObjList *moments, 115 virDomainMomentObj *moment); 116 void virDomainMomentObjListRemoveAll(virDomainMomentObjList *moments); 117 int virDomainMomentForEach(virDomainMomentObjList *moments, 118 virHashIterator iter, 119 void *data); 120 int virDomainMomentUpdateRelations(virDomainMomentObjList *moments); 121 int virDomainMomentCheckCycles(virDomainMomentObjList *list, 122 virDomainMomentDef *def, 123 const char *domname); 124 virDomainMomentObj *virDomainMomentFindLeaf(virDomainMomentObjList *list); 125