summaryrefslogtreecommitdiff
path: root/recipes/dbus/dbus-1.3.0
diff options
context:
space:
mode:
authorMichael 'Mickey' Lauer <mickey@vanille-media.de>2010-07-03 14:49:04 +0200
committerMichael 'Mickey' Lauer <mickey@vanille-media.de>2010-07-03 14:49:04 +0200
commit1ed91050c88399d2ff9be427d7952080ba2125ef (patch)
treed908406ba6057c88f284b944642034ff201586c7 /recipes/dbus/dbus-1.3.0
parentbf202453edaeab89ee88af25bb0bd1c6483ffdf7 (diff)
dbus: 1.3.0 -> 1.3.1
Diffstat (limited to 'recipes/dbus/dbus-1.3.0')
-rw-r--r--recipes/dbus/dbus-1.3.0/0001-Make-the-default-DBus-reply-timeout-configurable.patch78
-rw-r--r--recipes/dbus/dbus-1.3.0/cross.patch10
-rw-r--r--recipes/dbus/dbus-1.3.0/dbus-1.init111
-rw-r--r--recipes/dbus/dbus-1.3.0/fix-install-daemon.patch13
-rw-r--r--recipes/dbus/dbus-1.3.0/improve-threading-stability.patch38
-rw-r--r--recipes/dbus/dbus-1.3.0/tmpdir.patch30
-rw-r--r--recipes/dbus/dbus-1.3.0/will-1.patch25
-rw-r--r--recipes/dbus/dbus-1.3.0/will-2.patch370
-rw-r--r--recipes/dbus/dbus-1.3.0/will-3.patch119
-rw-r--r--recipes/dbus/dbus-1.3.0/will-4.patch56
-rw-r--r--recipes/dbus/dbus-1.3.0/will-5.patch116
-rw-r--r--recipes/dbus/dbus-1.3.0/will-6.patch456
12 files changed, 0 insertions, 1422 deletions
diff --git a/recipes/dbus/dbus-1.3.0/0001-Make-the-default-DBus-reply-timeout-configurable.patch b/recipes/dbus/dbus-1.3.0/0001-Make-the-default-DBus-reply-timeout-configurable.patch
deleted file mode 100644
index a38e3db0de..0000000000
--- a/recipes/dbus/dbus-1.3.0/0001-Make-the-default-DBus-reply-timeout-configurable.patch
+++ /dev/null
@@ -1,78 +0,0 @@
-From fb546488e93a1638d377b228bbb0d2ab58462168 Mon Sep 17 00:00:00 2001
-From: Daniel Willmann <daniel@totalueberwachung.de>
-Date: Thu, 2 Oct 2008 15:50:17 +0800
-Subject: [PATCH] Make the default DBus reply timeout configurable
-
-This patch adds an option --with-dbus-default-reply-timeout to configure
-that will set the default reply timeout used by libdbus in milliseconds.
-autoconf and autoheader need to be rerun in order to regenerate the
-correct configure and config.h.in files.
----
- configure.in | 9 +++++++++
- dbus/dbus-connection-internal.h | 3 ---
- dbus/dbus-pending-call.c | 1 +
- 3 files changed, 10 insertions(+), 3 deletions(-)
-
-diff --git a/configure.in b/configure.in
-index 62ac387..5c912d7 100644
---- a/configure.in
-+++ b/configure.in
-@@ -88,6 +88,7 @@ AC_ARG_WITH(console-auth-dir, AS_HELP_STRING([--with-console-auth-dir=[dirname]]
- AC_ARG_WITH(console-owner-file, AS_HELP_STRING([--with-console-owner-file=[filename]],[file whose owner determines current console owner]))
- AC_ARG_WITH(dbus_user, AS_HELP_STRING([--with-dbus-user=<user>],[User for running the DBUS daemon (messagebus)]))
- AC_ARG_WITH(dbus_daemondir, AS_HELP_STRING([--with-dbus-daemondir=[dirname]],[Directory for installing the DBUS daemon]))
-+AC_ARG_WITH(dbus_default_reply_timeout, AS_HELP_STRING([--with-dbus-default-reply-timeout=[milliseconds]],[Default reply timeout for DBus method calls]))
-
- AC_DEFINE(DBUS_UNIX,1,[dbus on unix])
-
-@@ -986,6 +987,13 @@ if test x$have_libaudit = xyes ; then
- AC_DEFINE(HAVE_LIBAUDIT,1,[audit daemon SELinux support])
- fi
-
-+if test -z "$with_dbus_default_reply_timeout" ; then
-+ DBUS_DEFAULT_REPLY_TIMEOUT=25000
-+else
-+ DBUS_DEFAULT_REPLY_TIMEOUT=$with_dbus_default_reply_timeout
-+fi
-+AC_DEFINE_UNQUOTED(_DBUS_DEFAULT_TIMEOUT_VALUE,$DBUS_DEFAULT_REPLY_TIMEOUT,[default timeout value for dbus calls])
-+
- #### Set up final flags
- DBUS_CLIENT_CFLAGS=
- DBUS_CLIENT_LIBS="$THREAD_LIBS"
-@@ -1348,6 +1356,7 @@ echo "
- Gettext libs (empty OK): ${INTLLIBS}
- Using XML parser: ${with_xml}
- Init scripts style: ${with_init_scripts}
-+ Default reply timeout: ${DBUS_DEFAULT_REPLY_TIMEOUT}
- Abstract socket names: ${ac_cv_have_abstract_sockets}
- System bus socket: ${DBUS_SYSTEM_SOCKET}
- System bus address: ${DBUS_SYSTEM_BUS_DEFAULT_ADDRESS}
-diff --git a/dbus/dbus-connection-internal.h b/dbus/dbus-connection-internal.h
-index df54412..5fe536b 100644
---- a/dbus/dbus-connection-internal.h
-+++ b/dbus/dbus-connection-internal.h
-@@ -41,9 +41,6 @@ typedef enum
- DBUS_ITERATION_BLOCK = 1 << 2 /**< Block if nothing to do. */
- } DBusIterationFlags;
-
--/** default timeout value when waiting for a message reply, 25 seconds */
--#define _DBUS_DEFAULT_TIMEOUT_VALUE (25 * 1000)
--
- void _dbus_connection_lock (DBusConnection *connection);
- void _dbus_connection_unlock (DBusConnection *connection);
- DBusConnection * _dbus_connection_ref_unlocked (DBusConnection *connection);
-diff --git a/dbus/dbus-pending-call.c b/dbus/dbus-pending-call.c
-index 51b9378..5a7a5f4 100644
---- a/dbus/dbus-pending-call.c
-+++ b/dbus/dbus-pending-call.c
-@@ -21,6 +21,7 @@
- *
- */
-
-+#include <config.h>
- #include "dbus-internals.h"
- #include "dbus-connection-internal.h"
- #include "dbus-pending-call-internal.h"
---
-1.5.6.4
-
diff --git a/recipes/dbus/dbus-1.3.0/cross.patch b/recipes/dbus/dbus-1.3.0/cross.patch
deleted file mode 100644
index 268a3ae3de..0000000000
--- a/recipes/dbus/dbus-1.3.0/cross.patch
+++ /dev/null
@@ -1,10 +0,0 @@
---- /tmp/configure.in 2006-11-09 21:47:10.000000000 +0100
-+++ dbus-0.95/configure.in 2006-11-09 21:48:13.108554000 +0100
-@@ -719,6 +719,7 @@
- exit (0);
- ]])],
- [ac_cv_have_abstract_sockets=yes],
-+ [ac_cv_have_abstract_sockets=no],
- [ac_cv_have_abstract_sockets=no]
- )])
- AC_LANG_POP(C)
diff --git a/recipes/dbus/dbus-1.3.0/dbus-1.init b/recipes/dbus/dbus-1.3.0/dbus-1.init
deleted file mode 100644
index a70e7a2373..0000000000
--- a/recipes/dbus/dbus-1.3.0/dbus-1.init
+++ /dev/null
@@ -1,111 +0,0 @@
-#! /bin/sh
-# -*- coding: utf-8 -*-
-# Debian init.d script for D-BUS
-# Copyright © 2003 Colin Walters <walters@debian.org>
-# Copyright 2008 OE Team
-
-set -e
-
-DAEMON=/usr/bin/dbus-daemon
-NAME=dbus
-DAEMONUSER=messagebus
-RUNDIR=/var/run/dbus
-PIDFILE=/var/run/dbus/pid
-UUIDDIR=/var/lib/dbus
-DESC="system message bus"
-EVENTDIR=/etc/dbus-1/event.d
-
-test -x $DAEMON || exit 0
-
-# Source defaults file; edit that file to configure this script.
-ENABLED=1
-PARAMS=""
-if [ -e /etc/default/dbus ]; then
- . /etc/default/dbus
-fi
-
-test "$ENABLED" != "0" || exit 0
-
-start_it_up()
-{
- if [ ! -d $RUNDIR ]; then
- mkdir -p $RUNDIR
- chown $DAEMONUSER $RUNDIR
- chgrp $DAEMONUSER $RUNDIR
- fi
- if [ -e $PIDFILE ]; then
- PIDDIR=/proc/$(cat $PIDFILE)
- if [ -d ${PIDDIR} -a "$(readlink -f ${PIDDIR}/exe)" = "${DAEMON}" ]; then
- echo "$DESC already started; not starting."
- else
- echo "Removing stale PID file $PIDFILE."
- rm -f $PIDFILE
- fi
- fi
-
- if [ ! -d $UUIDDIR ]; then
- mkdir -p $UUIDDIR
- chown $DAEMONUSER $UUIDDIR
- chgrp $DAEMONUSER $UUIDDIR
- fi
-
- dbus-uuidgen --ensure
-
- echo -n "Starting $DESC: "
- start-stop-daemon --start --pidfile $PIDFILE \
- --user $DAEMONUSER --exec $DAEMON -- --system $PARAMS
- echo "$NAME."
- if [ -d $EVENTDIR ]; then
- run-parts --arg=start $EVENTDIR
- fi
-}
-
-shut_it_down()
-{
- if [ -d $EVENTDIR ]; then
- # TODO: --reverse when busybox supports it
- run-parts --arg=stop $EVENTDIR
- fi
- echo -n "Stopping $DESC: "
- start-stop-daemon --stop --oknodo --pidfile $PIDFILE \
- --user $DAEMONUSER
- # We no longer include these arguments so that start-stop-daemon
- # can do its job even given that we may have been upgraded.
- # We rely on the pidfile being sanely managed
- # --exec $DAEMON -- --system $PARAMS
- echo "$NAME."
- rm -f $PIDFILE
-}
-
-reload_it()
-{
- echo -n "Reloading $DESC config: "
- dbus-send --print-reply --system --type=method_call \
- --dest=org.freedesktop.DBus \
- / org.freedesktop.DBus.ReloadConfig > /dev/null
- # hopefully this is enough time for dbus to reload it's config file.
- echo "done."
-}
-
-case "$1" in
- start)
- start_it_up
- ;;
- stop)
- shut_it_down
- ;;
- reload|force-reload)
- reload_it
- ;;
- restart)
- shut_it_down
- sleep 1
- start_it_up
- ;;
- *)
- echo "Usage: /etc/init.d/$NAME {start|stop|restart|reload|force-reload}" >&2
- exit 1
- ;;
-esac
-
-exit 0
diff --git a/recipes/dbus/dbus-1.3.0/fix-install-daemon.patch b/recipes/dbus/dbus-1.3.0/fix-install-daemon.patch
deleted file mode 100644
index c31786357d..0000000000
--- a/recipes/dbus/dbus-1.3.0/fix-install-daemon.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-Index: dbus-0.94/bus/Makefile.am
-===================================================================
---- dbus-0.94.orig/bus/Makefile.am 2006-10-01 17:36:18.000000000 +0200
-+++ dbus-0.94/bus/Makefile.am 2006-10-14 21:40:05.000000000 +0200
-@@ -110,7 +110,7 @@
- $(mkinstalldirs) $(DESTDIR)$(DBUS_DAEMONDIR); \
- chmod 755 $(DESTDIR)$(DBUS_DAEMONDIR); \
- fi
-- $(INSTALL_PROGRAM) dbus-daemon $(DESTDIR)$(DBUS_DAEMONDIR)
-+ $(INSTALL_PROGRAM) .libs/dbus-daemon $(DESTDIR)$(DBUS_DAEMONDIR)
- $(mkinstalldirs) $(DESTDIR)$(localstatedir)/run/dbus
- $(mkinstalldirs) $(DESTDIR)$(configdir)/system.d
- $(mkinstalldirs) $(DESTDIR)$(datadir)/dbus-1/services
diff --git a/recipes/dbus/dbus-1.3.0/improve-threading-stability.patch b/recipes/dbus/dbus-1.3.0/improve-threading-stability.patch
deleted file mode 100644
index 59de6ef27f..0000000000
--- a/recipes/dbus/dbus-1.3.0/improve-threading-stability.patch
+++ /dev/null
@@ -1,38 +0,0 @@
-From ae95a0ff9651a774cd983436d7e656c62492659c Mon Sep 17 00:00:00 2001
-From: Michael Meeks <michael.meeks@novell.com>
-Date: Fri, 12 Mar 2010 16:50:27 +0000
-Subject: [DBusConnection] When handling a watch, return if another thread is doing I/O
-
-http://lists.freedesktop.org/archives/dbus/2010-March/012337.html
-
-Previously, the watch handler would block until the I/O path was available.
-However, if another non-main thread was doing a synchronous call, this would
-cause the main thread to block on that thread, a highly undesirable
-thing because it's important for the main thread to remain responsive
-for user interfaces.
-
-Signed-off-by: Colin Walters <walters@verbum.org>
-Signed-off-by: Thiago Macieira <thiago@kde.org>
----
-diff --git a/dbus/dbus-connection.c b/dbus/dbus-connection.c
-index 5fb234d..69fdf53 100644
---- a/dbus/dbus-connection.c
-+++ b/dbus/dbus-connection.c
-@@ -1435,7 +1435,14 @@ _dbus_connection_handle_watch (DBusWatch *watch,
- _dbus_verbose ("%s start\n", _DBUS_FUNCTION_NAME);
-
- CONNECTION_LOCK (connection);
-- _dbus_connection_acquire_io_path (connection, -1);
-+
-+ if (!_dbus_connection_acquire_io_path (connection, 1))
-+ {
-+ /* another thread is handling the message */
-+ CONNECTION_UNLOCK (connection);
-+ return TRUE;
-+ }
-+
- HAVE_LOCK_CHECK (connection);
- retval = _dbus_transport_handle_watch (connection->transport,
- watch, condition);
---
-cgit v0.8.3-6-g21f6
diff --git a/recipes/dbus/dbus-1.3.0/tmpdir.patch b/recipes/dbus/dbus-1.3.0/tmpdir.patch
deleted file mode 100644
index 838b903f0a..0000000000
--- a/recipes/dbus/dbus-1.3.0/tmpdir.patch
+++ /dev/null
@@ -1,30 +0,0 @@
---- dbus-0.22/configure.in.orig 2004-08-13 00:57:16.000000000 +0200
-+++ dbus-0.22/configure.in 2004-12-30 21:15:57.000000000 +0100
-@@ -1047,15 +1048,18 @@
- AC_SUBST(ABSOLUTE_TOP_BUILDDIR)
-
- #### Find socket directories
--if ! test -z "$TMPDIR" ; then
-- DEFAULT_SOCKET_DIR=$TMPDIR
--elif ! test -z "$TEMP" ; then
-- DEFAULT_SOCKET_DIR=$TEMP
--elif ! test -z "$TMP" ; then
-- DEFAULT_SOCKET_DIR=$TMP
--else
-- DEFAULT_SOCKET_DIR=/tmp
--fi
-+#if ! test -z "$TMPDIR" ; then
-+# DEFAULT_SOCKET_DIR=$TMPDIR
-+#elif ! test -z "$TEMP" ; then
-+# DEFAULT_SOCKET_DIR=$TEMP
-+#elif ! test -z "$TMP" ; then
-+# DEFAULT_SOCKET_DIR=$TMP
-+#else
-+# DEFAULT_SOCKET_DIR=/tmp
-+#fi
-+
-+# checks disabled to avoid expanding this at build time
-+DEFAULT_SOCKET_DIR=/tmp
-
- if ! test -z "$with_test_socket_dir" ; then
- TEST_SOCKET_DIR="$with_test_socket_dir"
diff --git a/recipes/dbus/dbus-1.3.0/will-1.patch b/recipes/dbus/dbus-1.3.0/will-1.patch
deleted file mode 100644
index eb3bb9049e..0000000000
--- a/recipes/dbus/dbus-1.3.0/will-1.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-From aebf924fce126e4eb1409e995edb78f7c02f65b1 Mon Sep 17 00:00:00 2001
-From: Will Thompson <will.thompson@collabora.co.uk>
-Date: Wed, 29 Jul 2009 17:47:04 +0100
-Subject: [PATCH 1/6] Add a constant for the number of message types
-
----
- dbus/dbus-protocol.h | 2 ++
- 1 files changed, 2 insertions(+), 0 deletions(-)
-
-diff --git a/dbus/dbus-protocol.h b/dbus/dbus-protocol.h
-index a2284ee..17798e9 100644
---- a/dbus/dbus-protocol.h
-+++ b/dbus/dbus-protocol.h
-@@ -239,6 +239,8 @@ extern "C" {
- /** Message type of a signal message, see dbus_message_get_type() */
- #define DBUS_MESSAGE_TYPE_SIGNAL 4
-
-+#define DBUS_NUM_MESSAGE_TYPES 5
-+
- /* Header flags */
-
- /** If set, this flag means that the sender of a message does not care about getting
---
-1.6.3.3
-
diff --git a/recipes/dbus/dbus-1.3.0/will-2.patch b/recipes/dbus/dbus-1.3.0/will-2.patch
deleted file mode 100644
index e1c756bd64..0000000000
--- a/recipes/dbus/dbus-1.3.0/will-2.patch
+++ /dev/null
@@ -1,370 +0,0 @@
-From 2d4da5596b34cbd5de2b97971fbb484657a1f485 Mon Sep 17 00:00:00 2001
-From: Will Thompson <will.thompson@collabora.co.uk>
-Date: Wed, 29 Jul 2009 17:48:21 +0100
-Subject: [PATCH 2/6] Index match rules by message type
-
-This avoids scanning all the signal matches while dispatching method
-calls and returns, which are rarely matched against.
----
- bus/signals.c | 217 ++++++++++++++++++++++++++++++++++++--------------------
- 1 files changed, 139 insertions(+), 78 deletions(-)
-
-diff --git a/bus/signals.c b/bus/signals.c
-index b020a76..10e0b5e 100644
---- a/bus/signals.c
-+++ b/bus/signals.c
-@@ -1022,7 +1022,11 @@ struct BusMatchmaker
- {
- int refcount;
-
-- DBusList *all_rules;
-+ /* lists of rules, grouped by the type of message they match. 0
-+ * (DBUS_MESSAGE_TYPE_INVALID) represents rules that do not specify a message
-+ * type.
-+ */
-+ DBusList *rules_by_type[DBUS_NUM_MESSAGE_TYPES];
- };
-
- BusMatchmaker*
-@@ -1039,6 +1043,16 @@ bus_matchmaker_new (void)
- return matchmaker;
- }
-
-+static DBusList **
-+bus_matchmaker_get_rules (BusMatchmaker *matchmaker,
-+ int message_type)
-+{
-+ _dbus_assert (message_type >= 0);
-+ _dbus_assert (message_type < DBUS_NUM_MESSAGE_TYPES);
-+
-+ return matchmaker->rules_by_type + message_type;
-+}
-+
- BusMatchmaker *
- bus_matchmaker_ref (BusMatchmaker *matchmaker)
- {
-@@ -1057,14 +1071,20 @@ bus_matchmaker_unref (BusMatchmaker *matchmaker)
- matchmaker->refcount -= 1;
- if (matchmaker->refcount == 0)
- {
-- while (matchmaker->all_rules != NULL)
-+ int i;
-+
-+ for (i = DBUS_MESSAGE_TYPE_INVALID; i < DBUS_NUM_MESSAGE_TYPES; i++)
- {
-- BusMatchRule *rule;
-+ DBusList **rules = bus_matchmaker_get_rules (matchmaker, i);
-+
-+ while (*rules != NULL)
-+ {
-+ BusMatchRule *rule;
-
-- rule = matchmaker->all_rules->data;
-- bus_match_rule_unref (rule);
-- _dbus_list_remove_link (&matchmaker->all_rules,
-- matchmaker->all_rules);
-+ rule = (*rules)->data;
-+ bus_match_rule_unref (rule);
-+ _dbus_list_remove_link (rules, *rules);
-+ }
- }
-
- dbus_free (matchmaker);
-@@ -1076,14 +1096,18 @@ dbus_bool_t
- bus_matchmaker_add_rule (BusMatchmaker *matchmaker,
- BusMatchRule *rule)
- {
-+ DBusList **rules;
-+
- _dbus_assert (bus_connection_is_active (rule->matches_go_to));
-
-- if (!_dbus_list_append (&matchmaker->all_rules, rule))
-+ rules = bus_matchmaker_get_rules (matchmaker, rule->message_type);
-+
-+ if (!_dbus_list_append (rules, rule))
- return FALSE;
-
- if (!bus_connection_add_match_rule (rule->matches_go_to, rule))
- {
-- _dbus_list_remove_last (&matchmaker->all_rules, rule);
-+ _dbus_list_remove_last (rules, rule);
- return FALSE;
- }
-
-@@ -1171,13 +1195,13 @@ match_rule_equal (BusMatchRule *a,
- }
-
- static void
--bus_matchmaker_remove_rule_link (BusMatchmaker *matchmaker,
-+bus_matchmaker_remove_rule_link (DBusList **rules,
- DBusList *link)
- {
- BusMatchRule *rule = link->data;
-
- bus_connection_remove_match_rule (rule->matches_go_to, rule);
-- _dbus_list_remove_link (&matchmaker->all_rules, link);
-+ _dbus_list_remove_link (rules, link);
-
- #ifdef DBUS_ENABLE_VERBOSE_MODE
- {
-@@ -1196,8 +1220,12 @@ void
- bus_matchmaker_remove_rule (BusMatchmaker *matchmaker,
- BusMatchRule *rule)
- {
-+ DBusList **rules;
-+
- bus_connection_remove_match_rule (rule->matches_go_to, rule);
-- _dbus_list_remove (&matchmaker->all_rules, rule);
-+
-+ rules = bus_matchmaker_get_rules (matchmaker, rule->message_type);
-+ _dbus_list_remove (rules, rule);
-
- #ifdef DBUS_ENABLE_VERBOSE_MODE
- {
-@@ -1219,24 +1247,26 @@ bus_matchmaker_remove_rule_by_value (BusMatchmaker *matchmaker,
- DBusError *error)
- {
- /* FIXME this is an unoptimized linear scan */
--
-+ DBusList **rules;
- DBusList *link;
-
-+ rules = bus_matchmaker_get_rules (matchmaker, value->message_type);
-+
- /* we traverse backward because bus_connection_remove_match_rule()
- * removes the most-recently-added rule
- */
-- link = _dbus_list_get_last_link (&matchmaker->all_rules);
-+ link = _dbus_list_get_last_link (rules);
- while (link != NULL)
- {
- BusMatchRule *rule;
- DBusList *prev;
-
- rule = link->data;
-- prev = _dbus_list_get_prev_link (&matchmaker->all_rules, link);
-+ prev = _dbus_list_get_prev_link (rules, link);
-
- if (match_rule_equal (rule, value))
- {
-- bus_matchmaker_remove_rule_link (matchmaker, link);
-+ bus_matchmaker_remove_rule_link (rules, link);
- break;
- }
-
-@@ -1258,6 +1288,7 @@ bus_matchmaker_disconnected (BusMatchmaker *matchmaker,
- DBusConnection *disconnected)
- {
- DBusList *link;
-+ int i;
-
- /* FIXME
- *
-@@ -1270,41 +1301,46 @@ bus_matchmaker_disconnected (BusMatchmaker *matchmaker,
-
- _dbus_assert (bus_connection_is_active (disconnected));
-
-- link = _dbus_list_get_first_link (&matchmaker->all_rules);
-- while (link != NULL)
-+ for (i = DBUS_MESSAGE_TYPE_INVALID; i < DBUS_NUM_MESSAGE_TYPES; i++)
- {
-- BusMatchRule *rule;
-- DBusList *next;
-+ DBusList **rules = bus_matchmaker_get_rules (matchmaker, i);
-
-- rule = link->data;
-- next = _dbus_list_get_next_link (&matchmaker->all_rules, link);
--
-- if (rule->matches_go_to == disconnected)
-- {
-- bus_matchmaker_remove_rule_link (matchmaker, link);
-- }
-- else if (((rule->flags & BUS_MATCH_SENDER) && *rule->sender == ':') ||
-- ((rule->flags & BUS_MATCH_DESTINATION) && *rule->destination == ':'))
-+ link = _dbus_list_get_first_link (rules);
-+ while (link != NULL)
- {
-- /* 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))
-+ 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 (matchmaker, link);
-+ 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;
-+ link = next;
-+ }
- }
- }
-
-@@ -1504,38 +1540,16 @@ match_rule_matches (BusMatchRule *rule,
- return TRUE;
- }
-
--dbus_bool_t
--bus_matchmaker_get_recipients (BusMatchmaker *matchmaker,
-- BusConnections *connections,
-- DBusConnection *sender,
-- DBusConnection *addressed_recipient,
-- DBusMessage *message,
-- DBusList **recipients_p)
-+static dbus_bool_t
-+get_recipients_from_list (DBusList **rules,
-+ DBusConnection *sender,
-+ DBusConnection *addressed_recipient,
-+ DBusMessage *message,
-+ DBusList **recipients_p)
- {
-- /* FIXME for now this is a wholly unoptimized linear search */
-- /* Guessing the important optimization is to skip the signal-related
-- * match lists when processing method call and exception messages.
-- * So separate match rule lists for signals?
-- */
--
- DBusList *link;
-
-- _dbus_assert (*recipients_p == NULL);
--
-- /* This avoids sending same message to the same connection twice.
-- * Purpose of the stamp instead of a bool is to avoid iterating over
-- * all connections resetting the bool each time.
-- */
-- bus_connections_increment_stamp (connections);
--
-- /* addressed_recipient is already receiving the message, don't add to list.
-- * NULL addressed_recipient means either bus driver, or this is a signal
-- * and thus lacks a specific addressed_recipient.
-- */
-- if (addressed_recipient != NULL)
-- bus_connection_mark_stamp (addressed_recipient);
--
-- link = _dbus_list_get_first_link (&matchmaker->all_rules);
-+ link = _dbus_list_get_first_link (rules);
- while (link != NULL)
- {
- BusMatchRule *rule;
-@@ -1545,7 +1559,7 @@ bus_matchmaker_get_recipients (BusMatchmaker *matchmaker,
- #ifdef DBUS_ENABLE_VERBOSE_MODE
- {
- char *s = match_rule_to_string (rule);
--
-+
- _dbus_verbose ("Checking whether message matches rule %s for connection %p\n",
- s, rule->matches_go_to);
- dbus_free (s);
-@@ -1556,12 +1570,12 @@ bus_matchmaker_get_recipients (BusMatchmaker *matchmaker,
- sender, addressed_recipient, message))
- {
- _dbus_verbose ("Rule matched\n");
--
-+
- /* Append to the list if we haven't already */
- if (bus_connection_mark_stamp (rule->matches_go_to))
- {
- if (!_dbus_list_append (recipients_p, rule->matches_go_to))
-- goto nomem;
-+ return FALSE;
- }
- #ifdef DBUS_ENABLE_VERBOSE_MODE
- else
-@@ -1571,10 +1585,57 @@ bus_matchmaker_get_recipients (BusMatchmaker *matchmaker,
- #endif /* DBUS_ENABLE_VERBOSE_MODE */
- }
-
-- link = _dbus_list_get_next_link (&matchmaker->all_rules, link);
-+ link = _dbus_list_get_next_link (rules, link);
- }
-
- return TRUE;
-+}
-+
-+dbus_bool_t
-+bus_matchmaker_get_recipients (BusMatchmaker *matchmaker,
-+ BusConnections *connections,
-+ DBusConnection *sender,
-+ DBusConnection *addressed_recipient,
-+ DBusMessage *message,
-+ DBusList **recipients_p)
-+{
-+ /* FIXME for now this is a wholly unoptimized linear search */
-+ /* Guessing the important optimization is to skip the signal-related
-+ * match lists when processing method call and exception messages.
-+ * So separate match rule lists for signals?
-+ */
-+ int type;
-+
-+ _dbus_assert (*recipients_p == NULL);
-+
-+ /* This avoids sending same message to the same connection twice.
-+ * Purpose of the stamp instead of a bool is to avoid iterating over
-+ * all connections resetting the bool each time.
-+ */
-+ bus_connections_increment_stamp (connections);
-+
-+ /* addressed_recipient is already receiving the message, don't add to list.
-+ * NULL addressed_recipient means either bus driver, or this is a signal
-+ * and thus lacks a specific addressed_recipient.
-+ */
-+ if (addressed_recipient != NULL)
-+ bus_connection_mark_stamp (addressed_recipient);
-+
-+ /* We always need to try the rules that don't specify a message type */
-+ if (!get_recipients_from_list (
-+ bus_matchmaker_get_rules (matchmaker, DBUS_MESSAGE_TYPE_INVALID),
-+ sender, addressed_recipient, message, recipients_p))
-+ goto nomem;
-+
-+ /* Also try rules that match the type of this message */
-+ type = dbus_message_get_type (message);
-+ if (type > DBUS_MESSAGE_TYPE_INVALID && type < DBUS_NUM_MESSAGE_TYPES)
-+ if (!get_recipients_from_list (
-+ bus_matchmaker_get_rules (matchmaker, type),
-+ sender, addressed_recipient, message, recipients_p))
-+ goto nomem;
-+
-+ return TRUE;
-
- nomem:
- _dbus_list_clear (recipients_p);
---
-1.6.3.3
-
diff --git a/recipes/dbus/dbus-1.3.0/will-3.patch b/recipes/dbus/dbus-1.3.0/will-3.patch
deleted file mode 100644
index 80e1f33a03..0000000000
--- a/recipes/dbus/dbus-1.3.0/will-3.patch
+++ /dev/null
@@ -1,119 +0,0 @@
-From 8946958989828312ecf58dbaa581cbcebea8bcea Mon Sep 17 00:00:00 2001
-From: Will Thompson <will.thompson@collabora.co.uk>
-Date: Wed, 29 Jul 2009 17:53:37 +0100
-Subject: [PATCH 3/6] Don't bother re-matching features we've checked.
-
-This is currently not a big deal, but will make more of a difference
-once the set of match rules is partitioned by more features than just
-the message type.
----
- bus/signals.c | 29 ++++++++++++++++++-----------
- 1 files changed, 18 insertions(+), 11 deletions(-)
-
-diff --git a/bus/signals.c b/bus/signals.c
-index 10e0b5e..0509dd5 100644
---- a/bus/signals.c
-+++ b/bus/signals.c
-@@ -1369,8 +1369,11 @@ static dbus_bool_t
- match_rule_matches (BusMatchRule *rule,
- DBusConnection *sender,
- DBusConnection *addressed_recipient,
-- DBusMessage *message)
-+ DBusMessage *message,
-+ BusMatchFlags already_matched)
- {
-+ int flags;
-+
- /* All features of the match rule are AND'd together,
- * so FALSE if any of them don't match.
- */
-@@ -1379,8 +1382,11 @@ match_rule_matches (BusMatchRule *rule,
- * or for addressed_recipient may mean a message with no
- * specific recipient (i.e. a signal)
- */
--
-- if (rule->flags & BUS_MATCH_MESSAGE_TYPE)
-+
-+ /* Don't bother re-matching features we've already checked implicitly. */
-+ flags = rule->flags & (~already_matched);
-+
-+ if (flags & BUS_MATCH_MESSAGE_TYPE)
- {
- _dbus_assert (rule->message_type != DBUS_MESSAGE_TYPE_INVALID);
-
-@@ -1388,7 +1394,7 @@ match_rule_matches (BusMatchRule *rule,
- return FALSE;
- }
-
-- if (rule->flags & BUS_MATCH_INTERFACE)
-+ if (flags & BUS_MATCH_INTERFACE)
- {
- const char *iface;
-
-@@ -1402,7 +1408,7 @@ match_rule_matches (BusMatchRule *rule,
- return FALSE;
- }
-
-- if (rule->flags & BUS_MATCH_MEMBER)
-+ if (flags & BUS_MATCH_MEMBER)
- {
- const char *member;
-
-@@ -1416,7 +1422,7 @@ match_rule_matches (BusMatchRule *rule,
- return FALSE;
- }
-
-- if (rule->flags & BUS_MATCH_SENDER)
-+ if (flags & BUS_MATCH_SENDER)
- {
- _dbus_assert (rule->sender != NULL);
-
-@@ -1433,7 +1439,7 @@ match_rule_matches (BusMatchRule *rule,
- }
- }
-
-- if (rule->flags & BUS_MATCH_DESTINATION)
-+ if (flags & BUS_MATCH_DESTINATION)
- {
- const char *destination;
-
-@@ -1456,7 +1462,7 @@ match_rule_matches (BusMatchRule *rule,
- }
- }
-
-- if (rule->flags & BUS_MATCH_PATH)
-+ if (flags & BUS_MATCH_PATH)
- {
- const char *path;
-
-@@ -1470,7 +1476,7 @@ match_rule_matches (BusMatchRule *rule,
- return FALSE;
- }
-
-- if (rule->flags & BUS_MATCH_ARGS)
-+ if (flags & BUS_MATCH_ARGS)
- {
- int i;
- DBusMessageIter iter;
-@@ -1567,7 +1573,8 @@ get_recipients_from_list (DBusList **rules,
- #endif
-
- if (match_rule_matches (rule,
-- sender, addressed_recipient, message))
-+ sender, addressed_recipient, message,
-+ BUS_MATCH_MESSAGE_TYPE))
- {
- _dbus_verbose ("Rule matched\n");
-
-@@ -2004,7 +2011,7 @@ check_matches (dbus_bool_t expected_to_match,
- _dbus_assert (rule != NULL);
-
- /* We can't test sender/destination rules since we pass NULL here */
-- matched = match_rule_matches (rule, NULL, NULL, message);
-+ matched = match_rule_matches (rule, NULL, NULL, message, 0);
-
- if (matched != expected_to_match)
- {
---
-1.6.3.3
-
diff --git a/recipes/dbus/dbus-1.3.0/will-4.patch b/recipes/dbus/dbus-1.3.0/will-4.patch
deleted file mode 100644
index 2b2303bab3..0000000000
--- a/recipes/dbus/dbus-1.3.0/will-4.patch
+++ /dev/null
@@ -1,56 +0,0 @@
-From 9da8cbb9d9155bce885e0cfb39ba18a22ee6a76d Mon Sep 17 00:00:00 2001
-From: Will Thompson <will.thompson@collabora.co.uk>
-Date: Wed, 29 Jul 2009 18:52:28 +0100
-Subject: [PATCH 4/6] Extract freeing a DBusList<BusMatchRule>
-
----
- bus/signals.c | 26 ++++++++++++++------------
- 1 files changed, 14 insertions(+), 12 deletions(-)
-
-diff --git a/bus/signals.c b/bus/signals.c
-index 0509dd5..3cf846e 100644
---- a/bus/signals.c
-+++ b/bus/signals.c
-@@ -1029,6 +1029,19 @@ struct BusMatchmaker
- DBusList *rules_by_type[DBUS_NUM_MESSAGE_TYPES];
- };
-
-+static void
-+rule_list_free (DBusList **rules)
-+{
-+ while (*rules != NULL)
-+ {
-+ BusMatchRule *rule;
-+
-+ rule = (*rules)->data;
-+ bus_match_rule_unref (rule);
-+ _dbus_list_remove_link (rules, *rules);
-+ }
-+}
-+
- BusMatchmaker*
- bus_matchmaker_new (void)
- {
-@@ -1074,18 +1087,7 @@ bus_matchmaker_unref (BusMatchmaker *matchmaker)
- int i;
-
- for (i = DBUS_MESSAGE_TYPE_INVALID; i < DBUS_NUM_MESSAGE_TYPES; i++)
-- {
-- DBusList **rules = bus_matchmaker_get_rules (matchmaker, i);
--
-- while (*rules != NULL)
-- {
-- BusMatchRule *rule;
--
-- rule = (*rules)->data;
-- bus_match_rule_unref (rule);
-- _dbus_list_remove_link (rules, *rules);
-- }
-- }
-+ rule_list_free (bus_matchmaker_get_rules (matchmaker, i));
-
- dbus_free (matchmaker);
- }
---
-1.6.3.3
-
diff --git a/recipes/dbus/dbus-1.3.0/will-5.patch b/recipes/dbus/dbus-1.3.0/will-5.patch
deleted file mode 100644
index ed100005cf..0000000000
--- a/recipes/dbus/dbus-1.3.0/will-5.patch
+++ /dev/null
@@ -1,116 +0,0 @@
-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
-
diff --git a/recipes/dbus/dbus-1.3.0/will-6.patch b/recipes/dbus/dbus-1.3.0/will-6.patch
deleted file mode 100644
index 05d9c49e30..0000000000
--- a/recipes/dbus/dbus-1.3.0/will-6.patch
+++ /dev/null
@@ -1,456 +0,0 @@
-From 023bb6fdc82304866353a28cd503863e80c3ea0d Mon Sep 17 00:00:00 2001
-From: Will Thompson <will.thompson@collabora.co.uk>
-Date: Thu, 30 Jul 2009 10:49:33 +0100
-Subject: [PATCH 6/6] Group match rules by their interface.
-
-In my informal studies of "normal" sets of match rules, only checking
-match rules with the appropriate interface for the message reduces the
-number that need to be checked by almost 100x on average (ranging from
-halving for messages from the bus daemon, to a >200x reduction in many
-cases). This reduces the overhead added to dispatching each message by
-having lots of irrelevant match rules.
----
- bus/signals.c | 292 ++++++++++++++++++++++++++++++++++++++++++++++-----------
- 1 files changed, 239 insertions(+), 53 deletions(-)
-
-diff --git a/bus/signals.c b/bus/signals.c
-index c6f122b..23bf98a 100644
---- a/bus/signals.c
-+++ b/bus/signals.c
-@@ -1018,15 +1018,25 @@ bus_match_rule_parse (DBusConnection *matches_go_to,
- return rule;
- }
-
-+typedef struct RulePool RulePool;
-+struct RulePool
-+{
-+ /* Maps non-NULL interface names to non-NULL (DBusList **)s */
-+ DBusHashTable *rules_by_iface;
-+
-+ /* List of BusMatchRules which don't specify an interface */
-+ DBusList *rules_without_iface;
-+};
-+
- struct BusMatchmaker
- {
- int refcount;
-
-- /* lists of rules, grouped by the type of message they match. 0
-+ /* Pools of rules, grouped by the type of message they match. 0
- * (DBUS_MESSAGE_TYPE_INVALID) represents rules that do not specify a message
- * type.
- */
-- DBusList *rules_by_type[DBUS_NUM_MESSAGE_TYPES];
-+ RulePool rules_by_type[DBUS_NUM_MESSAGE_TYPES];
- };
-
- static void
-@@ -1042,28 +1052,139 @@ rule_list_free (DBusList **rules)
- }
- }
-
-+static void
-+rule_list_ptr_free (DBusList **list)
-+{
-+ /* We have to cope with NULL because the hash table frees the "existing"
-+ * value (which is NULL) when creating a new table entry...
-+ */
-+ if (list != NULL)
-+ {
-+ rule_list_free (list);
-+ dbus_free (list);
-+ }
-+}
-+
- BusMatchmaker*
- bus_matchmaker_new (void)
- {
- BusMatchmaker *matchmaker;
-+ int i;
-
- matchmaker = dbus_new0 (BusMatchmaker, 1);
- if (matchmaker == NULL)
- return NULL;
-
- matchmaker->refcount = 1;
--
-+
-+ for (i = DBUS_MESSAGE_TYPE_INVALID; i < DBUS_NUM_MESSAGE_TYPES; i++)
-+ {
-+ RulePool *p = matchmaker->rules_by_type + i;
-+
-+ p->rules_by_iface = _dbus_hash_table_new (DBUS_HASH_STRING,
-+ dbus_free, (DBusFreeFunction) rule_list_ptr_free);
-+
-+ if (p->rules_by_iface == NULL)
-+ goto nomem;
-+ }
-+
- return matchmaker;
-+
-+ nomem:
-+ for (i = DBUS_MESSAGE_TYPE_INVALID; i < DBUS_NUM_MESSAGE_TYPES; i++)
-+ {
-+ RulePool *p = matchmaker->rules_by_type + i;
-+
-+ if (p->rules_by_iface == NULL)
-+ break;
-+ else
-+ _dbus_hash_table_unref (p->rules_by_iface);
-+ }
-+
-+ return NULL;
- }
-
- static DBusList **
- bus_matchmaker_get_rules (BusMatchmaker *matchmaker,
-- int message_type)
-+ int message_type,
-+ const char *interface,
-+ dbus_bool_t create)
- {
-+ RulePool *p;
-+
- _dbus_assert (message_type >= 0);
- _dbus_assert (message_type < DBUS_NUM_MESSAGE_TYPES);
-
-- return matchmaker->rules_by_type + message_type;
-+ _dbus_verbose ("Looking up rules for message_type %d, interface %s\n",
-+ message_type,
-+ interface != NULL ? interface : "<null>");
-+
-+ p = matchmaker->rules_by_type + message_type;
-+
-+ if (interface == NULL)
-+ {
-+ return &p->rules_without_iface;
-+ }
-+ else
-+ {
-+ DBusList **list;
-+
-+ list = _dbus_hash_table_lookup_string (p->rules_by_iface, interface);
-+
-+ if (list == NULL && create)
-+ {
-+ char *dupped_interface;
-+
-+ list = dbus_new0 (DBusList *, 1);
-+ if (list == NULL)
-+ return NULL;
-+
-+ dupped_interface = _dbus_strdup (interface);
-+ if (dupped_interface == NULL)
-+ {
-+ dbus_free (list);
-+ return NULL;
-+ }
-+
-+ _dbus_verbose ("Adding list for type %d, iface %s\n", message_type,
-+ interface);
-+
-+ if (!_dbus_hash_table_insert_string (p->rules_by_iface,
-+ dupped_interface, list))
-+ {
-+ dbus_free (list);
-+ dbus_free (dupped_interface);
-+ return NULL;
-+ }
-+ }
-+
-+ return list;
-+ }
-+}
-+
-+static void
-+bus_matchmaker_gc_rules (BusMatchmaker *matchmaker,
-+ int message_type,
-+ const char *interface,
-+ DBusList **rules)
-+{
-+ RulePool *p;
-+
-+ if (interface == NULL)
-+ return;
-+
-+ if (*rules != NULL)
-+ return;
-+
-+ _dbus_verbose ("GCing HT entry for message_type %u, interface %s\n",
-+ message_type, interface);
-+
-+ p = matchmaker->rules_by_type + message_type;
-+
-+ _dbus_assert (_dbus_hash_table_lookup_string (p->rules_by_iface, interface)
-+ == rules);
-+
-+ _dbus_hash_table_remove_string (p->rules_by_iface, interface);
- }
-
- BusMatchmaker *
-@@ -1087,7 +1208,12 @@ bus_matchmaker_unref (BusMatchmaker *matchmaker)
- int i;
-
- for (i = DBUS_MESSAGE_TYPE_INVALID; i < DBUS_NUM_MESSAGE_TYPES; i++)
-- rule_list_free (bus_matchmaker_get_rules (matchmaker, i));
-+ {
-+ RulePool *p = matchmaker->rules_by_type + i;
-+
-+ _dbus_hash_table_unref (p->rules_by_iface);
-+ rule_list_free (&p->rules_without_iface);
-+ }
-
- dbus_free (matchmaker);
- }
-@@ -1102,7 +1228,15 @@ bus_matchmaker_add_rule (BusMatchmaker *matchmaker,
-
- _dbus_assert (bus_connection_is_active (rule->matches_go_to));
-
-- rules = bus_matchmaker_get_rules (matchmaker, rule->message_type);
-+ _dbus_verbose ("Adding rule with message_type %d, interface %s\n",
-+ rule->message_type,
-+ rule->interface != NULL ? rule->interface : "<null>");
-+
-+ rules = bus_matchmaker_get_rules (matchmaker, rule->message_type,
-+ rule->interface, TRUE);
-+
-+ if (rules == NULL)
-+ return FALSE;
-
- if (!_dbus_list_append (rules, rule))
- return FALSE;
-@@ -1110,9 +1244,11 @@ bus_matchmaker_add_rule (BusMatchmaker *matchmaker,
- if (!bus_connection_add_match_rule (rule->matches_go_to, rule))
- {
- _dbus_list_remove_last (rules, rule);
-+ bus_matchmaker_gc_rules (matchmaker, rule->message_type,
-+ rule->interface, rules);
- return FALSE;
- }
--
-+
- bus_match_rule_ref (rule);
-
- #ifdef DBUS_ENABLE_VERBOSE_MODE
-@@ -1224,10 +1360,23 @@ bus_matchmaker_remove_rule (BusMatchmaker *matchmaker,
- {
- DBusList **rules;
-
-+ _dbus_verbose ("Removing rule with message_type %d, interface %s\n",
-+ rule->message_type,
-+ rule->interface != NULL ? rule->interface : "<null>");
-+
- bus_connection_remove_match_rule (rule->matches_go_to, rule);
-
-- rules = bus_matchmaker_get_rules (matchmaker, rule->message_type);
-+ rules = bus_matchmaker_get_rules (matchmaker, rule->message_type,
-+ rule->interface, FALSE);
-+
-+ /* We should only be asked to remove a rule by identity right after it was
-+ * added, so there should be a list for it.
-+ */
-+ _dbus_assert (rules != NULL);
-+
- _dbus_list_remove (rules, rule);
-+ bus_matchmaker_gc_rules (matchmaker, rule->message_type, rule->interface,
-+ rules);
-
- #ifdef DBUS_ENABLE_VERBOSE_MODE
- {
-@@ -1248,31 +1397,38 @@ bus_matchmaker_remove_rule_by_value (BusMatchmaker *matchmaker,
- BusMatchRule *value,
- DBusError *error)
- {
-- /* FIXME this is an unoptimized linear scan */
- DBusList **rules;
-- DBusList *link;
-+ DBusList *link = NULL;
-
-- rules = bus_matchmaker_get_rules (matchmaker, value->message_type);
-+ _dbus_verbose ("Removing rule by value with message_type %d, interface %s\n",
-+ value->message_type,
-+ value->interface != NULL ? value->interface : "<null>");
-
-- /* we traverse backward because bus_connection_remove_match_rule()
-- * removes the most-recently-added rule
-- */
-- link = _dbus_list_get_last_link (rules);
-- while (link != NULL)
-+ rules = bus_matchmaker_get_rules (matchmaker, value->message_type,
-+ value->interface, FALSE);
-+
-+ if (rules != NULL)
- {
-- BusMatchRule *rule;
-- DBusList *prev;
-+ /* we traverse backward because bus_connection_remove_match_rule()
-+ * removes the most-recently-added rule
-+ */
-+ link = _dbus_list_get_last_link (rules);
-+ while (link != NULL)
-+ {
-+ BusMatchRule *rule;
-+ DBusList *prev;
-
-- rule = link->data;
-- prev = _dbus_list_get_prev_link (rules, link);
-+ rule = link->data;
-+ prev = _dbus_list_get_prev_link (rules, link);
-
-- if (match_rule_equal (rule, value))
-- {
-- bus_matchmaker_remove_rule_link (rules, link);
-- break;
-- }
-+ if (match_rule_equal (rule, value))
-+ {
-+ bus_matchmaker_remove_rule_link (rules, link);
-+ break;
-+ }
-
-- link = prev;
-+ link = prev;
-+ }
- }
-
- if (link == NULL)
-@@ -1282,6 +1438,9 @@ bus_matchmaker_remove_rule_by_value (BusMatchmaker *matchmaker,
- return FALSE;
- }
-
-+ bus_matchmaker_gc_rules (matchmaker, value->message_type, value->interface,
-+ rules);
-+
- return TRUE;
- }
-
-@@ -1341,16 +1500,29 @@ bus_matchmaker_disconnected (BusMatchmaker *matchmaker,
- * for the rules belonging to the connection, since we keep
- * a list of those; but for the rules that just refer to
- * the connection we'd need to do something more elaborate.
-- *
- */
--
-+
- _dbus_assert (bus_connection_is_active (disconnected));
-
-+ _dbus_verbose ("Removing all rules for connection %p\n", disconnected);
-+
- for (i = DBUS_MESSAGE_TYPE_INVALID; i < DBUS_NUM_MESSAGE_TYPES; i++)
- {
-- DBusList **rules = bus_matchmaker_get_rules (matchmaker, i);
-+ RulePool *p = matchmaker->rules_by_type + i;
-+ DBusHashIter iter;
-+
-+ rule_list_remove_by_connection (&p->rules_without_iface, disconnected);
-+
-+ _dbus_hash_iter_init (p->rules_by_iface, &iter);
-+ while (_dbus_hash_iter_next (&iter))
-+ {
-+ DBusList **items = _dbus_hash_iter_get_value (&iter);
-
-- rule_list_remove_by_connection (rules, disconnected);
-+ rule_list_remove_by_connection (items, disconnected);
-+
-+ if (*items == NULL)
-+ _dbus_hash_iter_remove_entry (&iter);
-+ }
- }
- }
-
-@@ -1565,6 +1737,9 @@ get_recipients_from_list (DBusList **rules,
- {
- DBusList *link;
-
-+ if (rules == NULL)
-+ return TRUE;
-+
- link = _dbus_list_get_first_link (rules);
- while (link != NULL)
- {
-@@ -1581,10 +1756,10 @@ get_recipients_from_list (DBusList **rules,
- dbus_free (s);
- }
- #endif
--
-+
- if (match_rule_matches (rule,
- sender, addressed_recipient, message,
-- BUS_MATCH_MESSAGE_TYPE))
-+ BUS_MATCH_MESSAGE_TYPE | BUS_MATCH_INTERFACE))
- {
- _dbus_verbose ("Rule matched\n");
-
-@@ -1616,12 +1791,9 @@ bus_matchmaker_get_recipients (BusMatchmaker *matchmaker,
- DBusMessage *message,
- DBusList **recipients_p)
- {
-- /* FIXME for now this is a wholly unoptimized linear search */
-- /* Guessing the important optimization is to skip the signal-related
-- * match lists when processing method call and exception messages.
-- * So separate match rule lists for signals?
-- */
- int type;
-+ const char *interface;
-+ DBusList **neither, **just_type, **just_iface, **both;
-
- _dbus_assert (*recipients_p == NULL);
-
-@@ -1638,25 +1810,39 @@ bus_matchmaker_get_recipients (BusMatchmaker *matchmaker,
- if (addressed_recipient != NULL)
- bus_connection_mark_stamp (addressed_recipient);
-
-- /* We always need to try the rules that don't specify a message type */
-- if (!get_recipients_from_list (
-- bus_matchmaker_get_rules (matchmaker, DBUS_MESSAGE_TYPE_INVALID),
-- sender, addressed_recipient, message, recipients_p))
-- goto nomem;
--
-- /* Also try rules that match the type of this message */
- type = dbus_message_get_type (message);
-+ interface = dbus_message_get_interface (message);
-+
-+ neither = bus_matchmaker_get_rules (matchmaker, DBUS_MESSAGE_TYPE_INVALID,
-+ NULL, FALSE);
-+ just_type = just_iface = both = NULL;
-+
-+ if (interface != NULL)
-+ just_iface = bus_matchmaker_get_rules (matchmaker,
-+ DBUS_MESSAGE_TYPE_INVALID, interface, FALSE);
-+
- if (type > DBUS_MESSAGE_TYPE_INVALID && type < DBUS_NUM_MESSAGE_TYPES)
-- if (!get_recipients_from_list (
-- bus_matchmaker_get_rules (matchmaker, type),
-- sender, addressed_recipient, message, recipients_p))
-- goto nomem;
-+ {
-+ just_type = bus_matchmaker_get_rules (matchmaker, type, NULL, FALSE);
-
-- return TRUE;
-+ if (interface != NULL)
-+ both = bus_matchmaker_get_rules (matchmaker, type, interface, FALSE);
-+ }
-
-- nomem:
-- _dbus_list_clear (recipients_p);
-- return FALSE;
-+ if (!(get_recipients_from_list (neither, sender, addressed_recipient,
-+ message, recipients_p) &&
-+ get_recipients_from_list (just_iface, sender, addressed_recipient,
-+ message, recipients_p) &&
-+ get_recipients_from_list (just_type, sender, addressed_recipient,
-+ message, recipients_p) &&
-+ get_recipients_from_list (both, sender, addressed_recipient,
-+ message, recipients_p)))
-+ {
-+ _dbus_list_clear (recipients_p);
-+ return FALSE;
-+ }
-+
-+ return TRUE;
- }
-
- #ifdef DBUS_BUILD_TESTS
---
-1.6.3.3
-