1 #include "yagl_sharegroup.h"
2 #include "yagl_object.h"
4 struct yagl_sharegroup_reap_entry
6 QLIST_ENTRY(yagl_sharegroup_reap_entry) entry;
8 struct yagl_object *obj;
11 QLIST_HEAD(yagl_object_list, yagl_sharegroup_reap_entry);
13 static void yagl_sharegroup_reap_list_move(struct yagl_sharegroup *sg,
14 struct yagl_object_list *tmp)
16 struct yagl_sharegroup_reap_entry *reap_entry, *next;
18 QLIST_FOREACH_SAFE(reap_entry, &sg->reap_list, entry, next) {
19 QLIST_REMOVE(reap_entry, entry);
20 QLIST_INSERT_HEAD(tmp, reap_entry, entry);
23 assert(QLIST_EMPTY(&sg->reap_list));
26 static void yagl_sharegroup_release_objects(struct yagl_object_list *tmp)
28 struct yagl_sharegroup_reap_entry *reap_entry, *next;
30 QLIST_FOREACH_SAFE(reap_entry, tmp, entry, next) {
31 QLIST_REMOVE(reap_entry, entry);
32 yagl_object_release(reap_entry->obj);
36 assert(QLIST_EMPTY(tmp));
39 static void yagl_sharegroup_destroy(struct yagl_ref *ref)
41 struct yagl_sharegroup *sg = (struct yagl_sharegroup*)ref;
42 struct yagl_sharegroup_reap_entry *reap_entry, *next_reap_entry;
45 QLIST_FOREACH_SAFE(reap_entry, &sg->reap_list, entry, next_reap_entry) {
46 QLIST_REMOVE(reap_entry, entry);
47 yagl_object_set_nodelete(reap_entry->obj);
48 yagl_object_release(reap_entry->obj);
52 assert(QLIST_EMPTY(&sg->reap_list));
54 for (i = 0; i < YAGL_NUM_NAMESPACES; ++i) {
55 yagl_namespace_cleanup(&sg->namespaces[i]);
58 qemu_mutex_destroy(&sg->mutex);
60 yagl_ref_cleanup(&sg->ref);
65 struct yagl_sharegroup *yagl_sharegroup_create(void)
67 struct yagl_sharegroup *sg = g_malloc0(sizeof(struct yagl_sharegroup));
70 yagl_ref_init(&sg->ref, &yagl_sharegroup_destroy);
72 qemu_mutex_init(&sg->mutex);
74 for (i = 0; i < YAGL_NUM_NAMESPACES; ++i) {
75 yagl_namespace_init(&sg->namespaces[i]);
78 QLIST_INIT(&sg->reap_list);
83 void yagl_sharegroup_acquire(struct yagl_sharegroup *sg)
86 yagl_ref_acquire(&sg->ref);
90 void yagl_sharegroup_release(struct yagl_sharegroup *sg)
93 yagl_ref_release(&sg->ref);
97 yagl_object_name yagl_sharegroup_add(struct yagl_sharegroup *sg,
99 struct yagl_object *obj)
101 struct yagl_object_list tmp;
102 yagl_object_name local_name;
106 qemu_mutex_lock(&sg->mutex);
108 yagl_sharegroup_reap_list_move(sg, &tmp);
110 local_name = yagl_namespace_add(&sg->namespaces[ns], obj);
112 qemu_mutex_unlock(&sg->mutex);
114 yagl_sharegroup_release_objects(&tmp);
119 struct yagl_object *yagl_sharegroup_add_named(struct yagl_sharegroup *sg,
121 yagl_object_name local_name,
122 struct yagl_object *obj)
124 struct yagl_object_list tmp;
125 struct yagl_object *ret;
129 qemu_mutex_lock(&sg->mutex);
131 yagl_sharegroup_reap_list_move(sg, &tmp);
133 ret = yagl_namespace_add_named(&sg->namespaces[ns], local_name, obj);
135 qemu_mutex_unlock(&sg->mutex);
137 yagl_sharegroup_release_objects(&tmp);
142 void yagl_sharegroup_remove(struct yagl_sharegroup *sg,
144 yagl_object_name local_name)
146 struct yagl_object_list tmp;
150 qemu_mutex_lock(&sg->mutex);
152 yagl_sharegroup_reap_list_move(sg, &tmp);
154 yagl_namespace_remove(&sg->namespaces[ns], local_name);
156 qemu_mutex_unlock(&sg->mutex);
158 yagl_sharegroup_release_objects(&tmp);
161 struct yagl_object *yagl_sharegroup_acquire_object(struct yagl_sharegroup *sg,
163 yagl_object_name local_name)
165 struct yagl_object_list tmp;
166 struct yagl_object *obj;
170 qemu_mutex_lock(&sg->mutex);
172 yagl_sharegroup_reap_list_move(sg, &tmp);
174 obj = yagl_namespace_acquire(&sg->namespaces[ns], local_name);
176 qemu_mutex_unlock(&sg->mutex);
178 yagl_sharegroup_release_objects(&tmp);
183 void yagl_sharegroup_reap_object(struct yagl_sharegroup *sg,
184 struct yagl_object *obj)
186 struct yagl_sharegroup_reap_entry *reap_entry;
188 reap_entry = g_malloc0(sizeof(*reap_entry));
190 reap_entry->obj = obj;
192 qemu_mutex_lock(&sg->mutex);
194 QLIST_INSERT_HEAD(&sg->reap_list, reap_entry, entry);
196 qemu_mutex_unlock(&sg->mutex);