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
=== modified file 'libdbusmenu-glib/server.c'
--- libdbusmenu-glib/server.c 2012-02-15 17:17:18 +0000
+++ libdbusmenu-glib/server.c 2012-03-27 17:29:25 +0000
@@ -64,6 +64,8 @@
6464
65 GArray * prop_array;65 GArray * prop_array;
66 guint property_idle;66 guint property_idle;
67
68 GHashTable * lookup_cache;
67};69};
6870
69#define DBUSMENU_SERVER_GET_PRIVATE(o) (DBUSMENU_SERVER(o)->priv)71#define DBUSMENU_SERVER_GET_PRIVATE(o) (DBUSMENU_SERVER(o)->priv)
@@ -378,6 +380,8 @@
378 priv->find_server_signal = 0;380 priv->find_server_signal = 0;
379 priv->dbus_registration = 0;381 priv->dbus_registration = 0;
380382
383 priv->lookup_cache = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, g_object_unref);
384
381 default_text_direction(self);385 default_text_direction(self);
382 priv->status = DBUSMENU_STATUS_NORMAL;386 priv->status = DBUSMENU_STATUS_NORMAL;
383 priv->icon_dirs = NULL;387 priv->icon_dirs = NULL;
@@ -450,10 +454,50 @@
450 priv->icon_dirs = NULL;454 priv->icon_dirs = NULL;
451 }455 }
452456
457 if (priv->lookup_cache) {
458 g_hash_table_destroy(priv->lookup_cache);
459 priv->lookup_cache = NULL;
460 }
461
453 G_OBJECT_CLASS (dbusmenu_server_parent_class)->finalize (object);462 G_OBJECT_CLASS (dbusmenu_server_parent_class)->finalize (object);
454 return;463 return;
455}464}
456465
466static DbusmenuMenuitem *
467lookup_menuitem_by_id (DbusmenuServer * server, gint id)
468{
469 DbusmenuServerPrivate * priv = DBUSMENU_SERVER_GET_PRIVATE(server);
470
471 DbusmenuMenuitem *res = (DbusmenuMenuitem *) g_hash_table_lookup(priv->lookup_cache, GINT_TO_POINTER(id));
472 if (!res && id == 0) {
473 return priv->root;
474 }
475
476 return res;
477}
478
479static void
480cache_remove_entries_for_menuitem (GHashTable * cache, DbusmenuMenuitem * item)
481{
482 g_hash_table_remove(cache, GINT_TO_POINTER(dbusmenu_menuitem_get_id(item)));
483
484 GList *child, *children = dbusmenu_menuitem_get_children(item);
485 for (child = children; child != NULL; child = child->next) {
486 cache_remove_entries_for_menuitem(cache, child->data);
487 }
488}
489
490static void
491cache_add_entries_for_menuitem (GHashTable * cache, DbusmenuMenuitem * item)
492{
493 g_hash_table_insert(cache, GINT_TO_POINTER(dbusmenu_menuitem_get_id(item)), g_object_ref(item));
494
495 GList *child, *children = dbusmenu_menuitem_get_children(item);
496 for (child = children; child != NULL; child = child->next) {
497 cache_add_entries_for_menuitem(cache, child->data);
498 }
499}
500
457static void501static void
458set_property (GObject * obj, guint id, const GValue * value, GParamSpec * pspec)502set_property (GObject * obj, guint id, const GValue * value, GParamSpec * pspec)
459{503{
@@ -480,6 +524,7 @@
480 if (priv->root != NULL) {524 if (priv->root != NULL) {
481 dbusmenu_menuitem_foreach(priv->root, menuitem_signals_remove, obj);525 dbusmenu_menuitem_foreach(priv->root, menuitem_signals_remove, obj);
482 dbusmenu_menuitem_set_root(priv->root, FALSE);526 dbusmenu_menuitem_set_root(priv->root, FALSE);
527 cache_remove_entries_for_menuitem(priv->lookup_cache, priv->root);
483528
484 GList * properties = dbusmenu_menuitem_properties_list(priv->root);529 GList * properties = dbusmenu_menuitem_properties_list(priv->root);
485 GList * iter;530 GList * iter;
@@ -495,6 +540,7 @@
495 priv->root = DBUSMENU_MENUITEM(g_value_get_object(value));540 priv->root = DBUSMENU_MENUITEM(g_value_get_object(value));
496 if (priv->root != NULL) {541 if (priv->root != NULL) {
497 g_object_ref(G_OBJECT(priv->root));542 g_object_ref(G_OBJECT(priv->root));
543 cache_add_entries_for_menuitem(priv->lookup_cache, priv->root);
498 dbusmenu_menuitem_set_root(priv->root, TRUE);544 dbusmenu_menuitem_set_root(priv->root, TRUE);
499 dbusmenu_menuitem_foreach(priv->root, menuitem_signals_create, obj);545 dbusmenu_menuitem_foreach(priv->root, menuitem_signals_create, obj);
500546
@@ -1161,6 +1207,7 @@
1161menuitem_child_added (DbusmenuMenuitem * parent, DbusmenuMenuitem * child, guint pos, DbusmenuServer * server)1207menuitem_child_added (DbusmenuMenuitem * parent, DbusmenuMenuitem * child, guint pos, DbusmenuServer * server)
1162{1208{
1163 menuitem_signals_create(child, server);1209 menuitem_signals_create(child, server);
1210 cache_add_entries_for_menuitem(server->priv->lookup_cache, child);
1164 g_list_foreach(dbusmenu_menuitem_get_children(child), added_check_children, server);1211 g_list_foreach(dbusmenu_menuitem_get_children(child), added_check_children, server);
11651212
1166 layout_update_signal(server);1213 layout_update_signal(server);
@@ -1171,6 +1218,7 @@
1171menuitem_child_removed (DbusmenuMenuitem * parent, DbusmenuMenuitem * child, DbusmenuServer * server)1218menuitem_child_removed (DbusmenuMenuitem * parent, DbusmenuMenuitem * child, DbusmenuServer * server)
1172{1219{
1173 menuitem_signals_remove(child, server);1220 menuitem_signals_remove(child, server);
1221 cache_remove_entries_for_menuitem(server->priv->lookup_cache, child);
1174 layout_update_signal(server);1222 layout_update_signal(server);
1175 return;1223 return;
1176}1224}
@@ -1259,7 +1307,7 @@
1259 GVariant * items = NULL;1307 GVariant * items = NULL;
12601308
1261 if (priv->root != NULL) {1309 if (priv->root != NULL) {
1262 DbusmenuMenuitem * mi = dbusmenu_menuitem_find_id(priv->root, parent);1310 DbusmenuMenuitem * mi = lookup_menuitem_by_id(server, parent);
12631311
1264 if (mi != NULL) {1312 if (mi != NULL) {
1265 items = dbusmenu_menuitem_build_variant(mi, props, recurse);1313 items = dbusmenu_menuitem_build_variant(mi, props, recurse);
@@ -1318,7 +1366,7 @@
13181366
1319 g_variant_get(params, "(i&s)", &id, &property);1367 g_variant_get(params, "(i&s)", &id, &property);
13201368
1321 DbusmenuMenuitem * mi = dbusmenu_menuitem_find_id(priv->root, id);1369 DbusmenuMenuitem * mi = lookup_menuitem_by_id(server, id);
13221370
1323 if (mi == NULL) {1371 if (mi == NULL) {
1324 g_dbus_method_invocation_return_error(invocation,1372 g_dbus_method_invocation_return_error(invocation,
@@ -1361,7 +1409,7 @@
1361 gint32 id;1409 gint32 id;
1362 g_variant_get(params, "(i)", &id);1410 g_variant_get(params, "(i)", &id);
13631411
1364 DbusmenuMenuitem * mi = dbusmenu_menuitem_find_id(priv->root, id);1412 DbusmenuMenuitem * mi = lookup_menuitem_by_id(server, id);
13651413
1366 if (mi == NULL) {1414 if (mi == NULL) {
1367 g_dbus_method_invocation_return_error(invocation,1415 g_dbus_method_invocation_return_error(invocation,
@@ -1424,7 +1472,7 @@
14241472
1425 gint32 id;1473 gint32 id;
1426 while (g_variant_iter_loop(ids, "i", &id)) {1474 while (g_variant_iter_loop(ids, "i", &id)) {
1427 DbusmenuMenuitem * mi = dbusmenu_menuitem_find_id(priv->root, id);1475 DbusmenuMenuitem * mi = lookup_menuitem_by_id(server, id);
1428 if (mi == NULL) continue;1476 if (mi == NULL) continue;
14291477
1430 if (!builder_init) {1478 if (!builder_init) {
@@ -1523,7 +1571,7 @@
1523 return;1571 return;
1524 }1572 }
15251573
1526 DbusmenuMenuitem * mi = dbusmenu_menuitem_find_id(priv->root, id);1574 DbusmenuMenuitem * mi = lookup_menuitem_by_id(server, id);
15271575
1528 if (mi == NULL) {1576 if (mi == NULL) {
1529 g_dbus_method_invocation_return_error(invocation,1577 g_dbus_method_invocation_return_error(invocation,
@@ -1606,7 +1654,7 @@
16061654
1607 g_variant_get(params, "(isvu)", &id, &etype, &data, &ts);1655 g_variant_get(params, "(isvu)", &id, &etype, &data, &ts);
16081656
1609 DbusmenuMenuitem * mi = dbusmenu_menuitem_find_id(priv->root, id);1657 DbusmenuMenuitem * mi = lookup_menuitem_by_id(server, id);
16101658
1611 if (mi == NULL) {1659 if (mi == NULL) {
1612 g_dbus_method_invocation_return_error(invocation,1660 g_dbus_method_invocation_return_error(invocation,
@@ -1648,7 +1696,7 @@
16481696
1649 gint32 id;1697 gint32 id;
1650 g_variant_get(params, "(i)", &id);1698 g_variant_get(params, "(i)", &id);
1651 DbusmenuMenuitem * mi = dbusmenu_menuitem_find_id(priv->root, id);1699 DbusmenuMenuitem * mi = lookup_menuitem_by_id(server, id);
16521700
1653 if (mi == NULL) {1701 if (mi == NULL) {
1654 g_dbus_method_invocation_return_error(invocation,1702 g_dbus_method_invocation_return_error(invocation,

Subscribers

People subscribed via source and target branches

to all changes: