diff options
Diffstat (limited to 'recipes/dbus/dbus-1.3.0/will-5.patch')
-rw-r--r-- | recipes/dbus/dbus-1.3.0/will-5.patch | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/recipes/dbus/dbus-1.3.0/will-5.patch b/recipes/dbus/dbus-1.3.0/will-5.patch new file mode 100644 index 0000000000..ed100005cf --- /dev/null +++ b/recipes/dbus/dbus-1.3.0/will-5.patch @@ -0,0 +1,116 @@ +From a40a026527e718547f32e134e7c27a561b1eba47 Mon Sep 17 00:00:00 2001 +From: Will Thompson <will.thompson@collabora.co.uk> +Date: Wed, 29 Jul 2009 20:03:40 +0100 +Subject: [PATCH 5/6] Extract rule_list_remove_by_connection + +--- + bus/signals.c | 82 +++++++++++++++++++++++++++++++------------------------- + 1 files changed, 45 insertions(+), 37 deletions(-) + +diff --git a/bus/signals.c b/bus/signals.c +index 3cf846e..c6f122b 100644 +--- a/bus/signals.c ++++ b/bus/signals.c +@@ -1285,11 +1285,54 @@ bus_matchmaker_remove_rule_by_value (BusMatchmaker *matchmaker, + return TRUE; + } + ++static void ++rule_list_remove_by_connection (DBusList **rules, ++ DBusConnection *disconnected) ++{ ++ DBusList *link; ++ ++ link = _dbus_list_get_first_link (rules); ++ while (link != NULL) ++ { ++ BusMatchRule *rule; ++ DBusList *next; ++ ++ rule = link->data; ++ next = _dbus_list_get_next_link (rules, link); ++ ++ if (rule->matches_go_to == disconnected) ++ { ++ bus_matchmaker_remove_rule_link (rules, link); ++ } ++ else if (((rule->flags & BUS_MATCH_SENDER) && *rule->sender == ':') || ++ ((rule->flags & BUS_MATCH_DESTINATION) && *rule->destination == ':')) ++ { ++ /* The rule matches to/from a base service, see if it's the ++ * one being disconnected, since we know this service name ++ * will never be recycled. ++ */ ++ const char *name; ++ ++ name = bus_connection_get_name (disconnected); ++ _dbus_assert (name != NULL); /* because we're an active connection */ ++ ++ if (((rule->flags & BUS_MATCH_SENDER) && ++ strcmp (rule->sender, name) == 0) || ++ ((rule->flags & BUS_MATCH_DESTINATION) && ++ strcmp (rule->destination, name) == 0)) ++ { ++ bus_matchmaker_remove_rule_link (rules, link); ++ } ++ } ++ ++ link = next; ++ } ++} ++ + void + bus_matchmaker_disconnected (BusMatchmaker *matchmaker, + DBusConnection *disconnected) + { +- DBusList *link; + int i; + + /* FIXME +@@ -1307,42 +1350,7 @@ bus_matchmaker_disconnected (BusMatchmaker *matchmaker, + { + DBusList **rules = bus_matchmaker_get_rules (matchmaker, i); + +- link = _dbus_list_get_first_link (rules); +- while (link != NULL) +- { +- BusMatchRule *rule; +- DBusList *next; +- +- rule = link->data; +- next = _dbus_list_get_next_link (rules, link); +- +- if (rule->matches_go_to == disconnected) +- { +- bus_matchmaker_remove_rule_link (rules, link); +- } +- else if (((rule->flags & BUS_MATCH_SENDER) && *rule->sender == ':') || +- ((rule->flags & BUS_MATCH_DESTINATION) && *rule->destination == ':')) +- { +- /* The rule matches to/from a base service, see if it's the +- * one being disconnected, since we know this service name +- * will never be recycled. +- */ +- const char *name; +- +- name = bus_connection_get_name (disconnected); +- _dbus_assert (name != NULL); /* because we're an active connection */ +- +- if (((rule->flags & BUS_MATCH_SENDER) && +- strcmp (rule->sender, name) == 0) || +- ((rule->flags & BUS_MATCH_DESTINATION) && +- strcmp (rule->destination, name) == 0)) +- { +- bus_matchmaker_remove_rule_link (rules, link); +- } +- } +- +- link = next; +- } ++ rule_list_remove_by_connection (rules, disconnected); + } + } + +-- +1.6.3.3 + |