Merge lp:~charlesk/libdbusmenu/lp-801699 into lp:libdbusmenu/0.6

Proposed by Charles Kerr
Status: Merged
Approved by: Charles Kerr
Approved revision: 390
Merged at revision: 393
Proposed branch: lp:~charlesk/libdbusmenu/lp-801699
Merge into: lp:libdbusmenu/0.6
Diff against target: 167 lines (+55/-7)
1 file modified
libdbusmenu-glib/server.c (+55/-7)
To merge this branch: bzr merge lp:~charlesk/libdbusmenu/lp-801699
Reviewer Review Type Date Requested Status
Charles Kerr (community) Approve
Review via email: mp+99568@code.launchpad.net

Description of the change

This is ChrisCoulson's patch to add a lookup hash to avoid the overhead of calling dbusmenu_menuitem_find_id() when possible.

To post a comment you must log in.
Revision history for this message
Charles Kerr (charlesk) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'libdbusmenu-glib/server.c'
2--- libdbusmenu-glib/server.c 2012-02-15 17:17:18 +0000
3+++ libdbusmenu-glib/server.c 2012-03-27 17:29:25 +0000
4@@ -64,6 +64,8 @@
5
6 GArray * prop_array;
7 guint property_idle;
8+
9+ GHashTable * lookup_cache;
10 };
11
12 #define DBUSMENU_SERVER_GET_PRIVATE(o) (DBUSMENU_SERVER(o)->priv)
13@@ -378,6 +380,8 @@
14 priv->find_server_signal = 0;
15 priv->dbus_registration = 0;
16
17+ priv->lookup_cache = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, g_object_unref);
18+
19 default_text_direction(self);
20 priv->status = DBUSMENU_STATUS_NORMAL;
21 priv->icon_dirs = NULL;
22@@ -450,10 +454,50 @@
23 priv->icon_dirs = NULL;
24 }
25
26+ if (priv->lookup_cache) {
27+ g_hash_table_destroy(priv->lookup_cache);
28+ priv->lookup_cache = NULL;
29+ }
30+
31 G_OBJECT_CLASS (dbusmenu_server_parent_class)->finalize (object);
32 return;
33 }
34
35+static DbusmenuMenuitem *
36+lookup_menuitem_by_id (DbusmenuServer * server, gint id)
37+{
38+ DbusmenuServerPrivate * priv = DBUSMENU_SERVER_GET_PRIVATE(server);
39+
40+ DbusmenuMenuitem *res = (DbusmenuMenuitem *) g_hash_table_lookup(priv->lookup_cache, GINT_TO_POINTER(id));
41+ if (!res && id == 0) {
42+ return priv->root;
43+ }
44+
45+ return res;
46+}
47+
48+static void
49+cache_remove_entries_for_menuitem (GHashTable * cache, DbusmenuMenuitem * item)
50+{
51+ g_hash_table_remove(cache, GINT_TO_POINTER(dbusmenu_menuitem_get_id(item)));
52+
53+ GList *child, *children = dbusmenu_menuitem_get_children(item);
54+ for (child = children; child != NULL; child = child->next) {
55+ cache_remove_entries_for_menuitem(cache, child->data);
56+ }
57+}
58+
59+static void
60+cache_add_entries_for_menuitem (GHashTable * cache, DbusmenuMenuitem * item)
61+{
62+ g_hash_table_insert(cache, GINT_TO_POINTER(dbusmenu_menuitem_get_id(item)), g_object_ref(item));
63+
64+ GList *child, *children = dbusmenu_menuitem_get_children(item);
65+ for (child = children; child != NULL; child = child->next) {
66+ cache_add_entries_for_menuitem(cache, child->data);
67+ }
68+}
69+
70 static void
71 set_property (GObject * obj, guint id, const GValue * value, GParamSpec * pspec)
72 {
73@@ -480,6 +524,7 @@
74 if (priv->root != NULL) {
75 dbusmenu_menuitem_foreach(priv->root, menuitem_signals_remove, obj);
76 dbusmenu_menuitem_set_root(priv->root, FALSE);
77+ cache_remove_entries_for_menuitem(priv->lookup_cache, priv->root);
78
79 GList * properties = dbusmenu_menuitem_properties_list(priv->root);
80 GList * iter;
81@@ -495,6 +540,7 @@
82 priv->root = DBUSMENU_MENUITEM(g_value_get_object(value));
83 if (priv->root != NULL) {
84 g_object_ref(G_OBJECT(priv->root));
85+ cache_add_entries_for_menuitem(priv->lookup_cache, priv->root);
86 dbusmenu_menuitem_set_root(priv->root, TRUE);
87 dbusmenu_menuitem_foreach(priv->root, menuitem_signals_create, obj);
88
89@@ -1161,6 +1207,7 @@
90 menuitem_child_added (DbusmenuMenuitem * parent, DbusmenuMenuitem * child, guint pos, DbusmenuServer * server)
91 {
92 menuitem_signals_create(child, server);
93+ cache_add_entries_for_menuitem(server->priv->lookup_cache, child);
94 g_list_foreach(dbusmenu_menuitem_get_children(child), added_check_children, server);
95
96 layout_update_signal(server);
97@@ -1171,6 +1218,7 @@
98 menuitem_child_removed (DbusmenuMenuitem * parent, DbusmenuMenuitem * child, DbusmenuServer * server)
99 {
100 menuitem_signals_remove(child, server);
101+ cache_remove_entries_for_menuitem(server->priv->lookup_cache, child);
102 layout_update_signal(server);
103 return;
104 }
105@@ -1259,7 +1307,7 @@
106 GVariant * items = NULL;
107
108 if (priv->root != NULL) {
109- DbusmenuMenuitem * mi = dbusmenu_menuitem_find_id(priv->root, parent);
110+ DbusmenuMenuitem * mi = lookup_menuitem_by_id(server, parent);
111
112 if (mi != NULL) {
113 items = dbusmenu_menuitem_build_variant(mi, props, recurse);
114@@ -1318,7 +1366,7 @@
115
116 g_variant_get(params, "(i&s)", &id, &property);
117
118- DbusmenuMenuitem * mi = dbusmenu_menuitem_find_id(priv->root, id);
119+ DbusmenuMenuitem * mi = lookup_menuitem_by_id(server, id);
120
121 if (mi == NULL) {
122 g_dbus_method_invocation_return_error(invocation,
123@@ -1361,7 +1409,7 @@
124 gint32 id;
125 g_variant_get(params, "(i)", &id);
126
127- DbusmenuMenuitem * mi = dbusmenu_menuitem_find_id(priv->root, id);
128+ DbusmenuMenuitem * mi = lookup_menuitem_by_id(server, id);
129
130 if (mi == NULL) {
131 g_dbus_method_invocation_return_error(invocation,
132@@ -1424,7 +1472,7 @@
133
134 gint32 id;
135 while (g_variant_iter_loop(ids, "i", &id)) {
136- DbusmenuMenuitem * mi = dbusmenu_menuitem_find_id(priv->root, id);
137+ DbusmenuMenuitem * mi = lookup_menuitem_by_id(server, id);
138 if (mi == NULL) continue;
139
140 if (!builder_init) {
141@@ -1523,7 +1571,7 @@
142 return;
143 }
144
145- DbusmenuMenuitem * mi = dbusmenu_menuitem_find_id(priv->root, id);
146+ DbusmenuMenuitem * mi = lookup_menuitem_by_id(server, id);
147
148 if (mi == NULL) {
149 g_dbus_method_invocation_return_error(invocation,
150@@ -1606,7 +1654,7 @@
151
152 g_variant_get(params, "(isvu)", &id, &etype, &data, &ts);
153
154- DbusmenuMenuitem * mi = dbusmenu_menuitem_find_id(priv->root, id);
155+ DbusmenuMenuitem * mi = lookup_menuitem_by_id(server, id);
156
157 if (mi == NULL) {
158 g_dbus_method_invocation_return_error(invocation,
159@@ -1648,7 +1696,7 @@
160
161 gint32 id;
162 g_variant_get(params, "(i)", &id);
163- DbusmenuMenuitem * mi = dbusmenu_menuitem_find_id(priv->root, id);
164+ DbusmenuMenuitem * mi = lookup_menuitem_by_id(server, id);
165
166 if (mi == NULL) {
167 g_dbus_method_invocation_return_error(invocation,

Subscribers

People subscribed via source and target branches

to all changes: