Merge lp:~sforshee/powerd/hash-iterator into lp:powerd

Proposed by Seth Forshee
Status: Merged
Approved by: Matt Fischer
Approved revision: 76
Merged at revision: 74
Proposed branch: lp:~sforshee/powerd/hash-iterator
Merge into: lp:powerd
Diff against target: 271 lines (+59/-111)
3 files modified
src/display-request.c (+28/-48)
src/power-request.c (+31/-58)
src/powerd-internal.h (+0/-5)
To merge this branch: bzr merge lp:~sforshee/powerd/hash-iterator
Reviewer Review Type Date Requested Status
Matt Fischer (community) Approve
PS Jenkins bot continuous-integration Approve
Review via email: mp+176513@code.launchpad.net

Commit message

Change hash usage to use iterators instead of g_hash_table_foreach()

Description of the change

Change hash usage to use iterators instead of g_hash_table_foreach()

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Matt Fischer (mfisch) wrote :

Looks cleaner

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/display-request.c'
2--- src/display-request.c 2013-07-17 22:39:08 +0000
3+++ src/display-request.c 2013-07-23 20:50:35 +0000
4@@ -356,25 +356,26 @@
5 return TRUE;
6 }
7
8-static void add_request_to_builder(gpointer key, gpointer value, gpointer data)
9-{
10- struct display_request_internal *ireq = value;
11- struct powerd_display_request *req = &ireq->req;
12- GVariantBuilder *builder = data;
13- char cookie_str[UUID_STR_LEN];
14-
15- uuid_unparse(req->cookie, cookie_str);
16- powerd_debug(" owner: %s, cookie: %s, state: %d, flags: %#08x",
17- ireq->owner, cookie_str, req->state, req->flags);
18-
19- g_variant_builder_add(builder, "(siu)", ireq->owner, req->state, req->flags);
20-}
21-
22 static int build_display_request_list(GVariantBuilder *builder)
23 {
24+ GHashTableIter iter;
25+ gpointer key, value;
26+ int count = 0;
27+
28+ g_hash_table_iter_init(&iter, display_request_hash);
29 powerd_debug("Display state requests:");
30- g_hash_table_foreach(display_request_hash, add_request_to_builder, builder);
31- return g_hash_table_size(display_request_hash);
32+ while (g_hash_table_iter_next(&iter, &key, &value)) {
33+ unsigned char *uuid = key;
34+ struct display_request_internal *ireq = value;
35+ struct powerd_display_request *req = &ireq->req;
36+ char cookie_str[UUID_STR_LEN];
37+ uuid_unparse(uuid, cookie_str);
38+ powerd_debug(" owner: %s, cookie: %s, state: %d, flags: %#08x",
39+ ireq->owner, cookie_str, req->state, req->flags);
40+ g_variant_builder_add(builder, "(siu)", ireq->owner, req->state, req->flags);
41+ count++;
42+ }
43+ return count;
44 }
45
46 gboolean handle_list_display_requests(PowerdSource *obj,
47@@ -422,17 +423,6 @@
48 g_hash_table_destroy(display_request_hash);
49 }
50
51-static void
52-find_uuids_by_owner_iter(gpointer key, gpointer value, gpointer data)
53-{
54- struct display_request_internal *dri = (struct display_request_internal*)value;
55- struct UuidListForOwner *ulfo = (struct UuidListForOwner *)data;
56-
57- if (!strcmp(ulfo->owner,dri->owner)) {
58- ulfo->uuids = g_slist_append(ulfo->uuids, key);
59- }
60-}
61-
62 /*
63 * Callers may use this to clear all requests that the specified owner
64 * is holding. This is used when the owner drops off of dbus
65@@ -440,27 +430,17 @@
66 void
67 clear_disp_state_by_owner(const char *owner)
68 {
69- struct UuidListForOwner ulfo = { 0, };
70- GSList *iter = NULL;
71- char cookie_str[UUID_STR_LEN];
72-
73- if (owner == NULL) {
74- return;
75- }
76-
77- ulfo.owner = owner;
78-
79- g_hash_table_foreach(display_request_hash, find_uuids_by_owner_iter, &ulfo);
80-
81- if (ulfo.uuids) {
82- powerd_debug("%d display requests to remove due to dbus vanishing",
83- g_slist_length(ulfo.uuids));
84- for (iter = ulfo.uuids; iter; iter = iter->next) {
85- /* XXX: For debug, remove later */
86- uuid_unparse(iter->data, cookie_str);
87- powerd_debug("removing %s", cookie_str);
88- remove_request(iter->data);
89+ GHashTableIter iter;
90+ gpointer key, value;
91+
92+ g_hash_table_iter_init(&iter, display_request_hash);
93+ while (g_hash_table_iter_next(&iter, &key, &value)) {
94+ struct display_request_internal *ireq = value;
95+ if (!strcmp(owner, ireq->owner)) {
96+ __remove_request(&ireq->req);
97+ powerd_dbus_name_watch_remove(ireq->owner);
98+ g_hash_table_iter_remove(&iter);
99 }
100- g_slist_free(ulfo.uuids);
101 }
102+ update_internal_state();
103 }
104
105=== modified file 'src/power-request.c'
106--- src/power-request.c 2013-07-02 16:37:37 +0000
107+++ src/power-request.c 2013-07-23 20:50:35 +0000
108@@ -153,22 +153,6 @@
109 return state > POWERD_SYS_STATE_SUSPEND && state < POWERD_NUM_POWER_STATES;
110 }
111
112-static void
113-list_request(gpointer key, gpointer value, gpointer data)
114-{
115- struct SysStateRequest *sr = (struct SysStateRequest *)value;
116- GVariantBuilder *builder = (GVariantBuilder *)data;
117- char cookie_str[UUID_STR_LEN];
118-
119- /* XXX: For debug, remove later */
120- uuid_unparse(sr->cookie, cookie_str);
121- powerd_debug(" Owner: %s, Cookie: %s, State: %s (%d)",
122- sr->owner, cookie_str, state_to_string(sr->state), sr->state);
123-
124- if (builder)
125- g_variant_builder_add(builder, "(si)", sr->owner, sr->state);
126-}
127-
128 /*
129 * Must only be called from main loop.
130 *
131@@ -179,12 +163,23 @@
132 static guint
133 list_sys_requests_internal(GVariantBuilder *builder)
134 {
135+ GHashTableIter iter;
136+ gpointer key, value;
137 guint count = 0;
138
139+ g_hash_table_iter_init(&iter, state_request_hash);
140 powerd_debug("System state requests:");
141- g_hash_table_foreach(state_request_hash, list_request, builder);
142- count = g_hash_table_size(state_request_hash);
143-
144+ while (g_hash_table_iter_next(&iter, &key, &value)) {
145+ unsigned char *uuid = key;
146+ struct SysStateRequest *req = value;
147+ char cookie_str[UUID_STR_LEN];
148+ uuid_unparse(uuid, cookie_str);
149+ powerd_debug(" Owner: %s, Cookie: %s, State: %s (%d)",
150+ req->owner, cookie_str, state_to_string(req->state),
151+ req->state);
152+ g_variant_builder_add(builder, "(si)", req->owner, req->state);
153+ count++;
154+ }
155 return count;
156 }
157
158@@ -279,6 +274,12 @@
159 return TRUE;
160 }
161
162+static void __clear_sys_request(struct SysStateRequest *req)
163+{
164+ powerd_dbus_name_watch_remove(req->owner);
165+ state_request_count[req->state - 1] -= 1;
166+}
167+
168 /* Must only be called from main loop */
169 static int
170 clear_sys_state_worker(gpointer data)
171@@ -286,7 +287,6 @@
172 unsigned char *uuid = data;
173 struct SysStateRequest *sr;
174 int found = FALSE;
175- enum SysPowerStates state;
176
177 /*
178 * This involves two lookups into the hash, one to find the
179@@ -297,18 +297,14 @@
180 */
181 sr = g_hash_table_lookup(state_request_hash, uuid);
182 if (sr) {
183- state = sr->state;
184 /* We need to remove it from our watch hash before we remove it
185 * from the state hash or the sr->owner memory will be freed
186 * before we try to use it.
187 */
188- powerd_dbus_name_watch_remove(sr->owner);
189+ __clear_sys_request(sr);
190 found = g_hash_table_remove(state_request_hash, uuid);
191 if (!found)
192 powerd_warn("State request found on lookup but not on remove");
193- else {
194- state_request_count[state - 1] -= 1;
195- }
196 }
197
198 return found;
199@@ -614,17 +610,6 @@
200 g_queue_clear(&queued_state_changes);
201 }
202
203-static void
204-find_uuids_by_owner_iter(gpointer key, gpointer value, gpointer data)
205-{
206- struct SysStateRequest *sr = (struct SysStateRequest *)value;
207- struct UuidListForOwner *ulfo = (struct UuidListForOwner *)data;
208-
209- if (!strcmp(ulfo->owner,sr->owner)) {
210- ulfo->uuids = g_slist_append(ulfo->uuids, key);
211- }
212-}
213-
214 /*
215 * Callers may use this to clear all requests that the specified owner
216 * is holding. This is used when the owner drops off of dbus
217@@ -632,28 +617,16 @@
218 void
219 clear_sys_state_by_owner(const char *owner)
220 {
221- struct UuidListForOwner ulfo = { 0, };
222- GSList *iter = NULL;
223- char cookie_str[UUID_STR_LEN];
224-
225-
226- if (owner == NULL) {
227- return;
228- }
229-
230- ulfo.owner = owner;
231-
232- g_hash_table_foreach(state_request_hash, find_uuids_by_owner_iter, &ulfo);
233-
234- if (ulfo.uuids) {
235- powerd_debug("%d sys requests to remove due to dbus vanishing",
236- g_slist_length(ulfo.uuids));
237- for (iter = ulfo.uuids; iter; iter = iter->next) {
238- /* XXX: For debug, remove later */
239- uuid_unparse(iter->data, cookie_str);
240- powerd_debug("removing %s", cookie_str);
241- clear_sys_state_internal(iter->data);
242+ GHashTableIter iter;
243+ gpointer key, value;
244+
245+ g_hash_table_iter_init(&iter, state_request_hash);
246+ while (g_hash_table_iter_next(&iter, &key, &value)) {
247+ struct SysStateRequest *req = value;
248+ if (!strcmp(owner, req->owner)) {
249+ __clear_sys_request(req);
250+ g_hash_table_iter_remove(&iter);
251 }
252- g_slist_free(ulfo.uuids);
253 }
254+ update_system_state();
255 }
256
257=== modified file 'src/powerd-internal.h'
258--- src/powerd-internal.h 2013-07-18 17:24:47 +0000
259+++ src/powerd-internal.h 2013-07-23 20:50:35 +0000
260@@ -51,11 +51,6 @@
261 uint ref_count;
262 };
263
264-struct UuidListForOwner {
265- const char *owner;
266- GSList *uuids;
267-};
268-
269 void powerd_shutdown(void);
270 void powerd_exit(int exit_code);
271 void powerd_reset_activity_timer(int add);

Subscribers

People subscribed via source and target branches