From ad711211f49bb13953cac719106eb16832ee7d5b Mon Sep 17 00:00:00 2001 From: Michal Eljasiewicz Date: Thu, 5 Sep 2013 12:50:46 +0200 Subject: [PATCH 1/1] Optimization: transport_is_kdbus parses address once Change-Id: Ic9a1afbd2ee2da175b2e100543af2fcfef0db126 --- dbus/dbus-connection.c | 11 +++++++++++ dbus/dbus-connection.h | 4 ++++ dbus/dbus-transport-kdbus.c | 26 +++++++++++++++++++++++--- 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/dbus/dbus-connection.c b/dbus/dbus-connection.c index 25aaae6..7697bac 100644 --- a/dbus/dbus-connection.c +++ b/dbus/dbus-connection.c @@ -335,6 +335,7 @@ struct DBusConnection #if defined(DBUS_ENABLE_CHECKS) || defined(DBUS_ENABLE_ASSERT) int generation; /**< _dbus_current_generation that should correspond to this connection */ #endif + unsigned int is_kdbus; /* Samsung change: to spare comparing address too often. 0 - uninitialized, 1 - not kdbus, 2 - kdbus */ }; static DBusDispatchStatus _dbus_connection_get_dispatch_status_unlocked (DBusConnection *connection); @@ -1992,6 +1993,16 @@ _dbus_connection_preallocate_send_unlocked (DBusConnection *connection) return NULL; } +unsigned int dbus_connection_get_is_kdbus(DBusConnection *connection) +{ + return connection->is_kdbus; +} + +void dbus_connection_set_is_kdbus(DBusConnection *connection, unsigned int value) +{ + connection->is_kdbus = value; +} + /* Called with lock held, does not update dispatch status */ static void _dbus_connection_send_preallocated_unlocked_no_update (DBusConnection *connection, diff --git a/dbus/dbus-connection.h b/dbus/dbus-connection.h index d223954..de11e6d 100644 --- a/dbus/dbus-connection.h +++ b/dbus/dbus-connection.h @@ -189,6 +189,10 @@ void dbus_connection_close (DBusConnection DBUS_EXPORT dbus_bool_t dbus_connection_get_is_connected (DBusConnection *connection); DBUS_EXPORT +unsigned int dbus_connection_get_is_kdbus (DBusConnection *connection); +DBUS_EXPORT +void dbus_connection_set_is_kdbus (DBusConnection *connection, unsigned int value); +DBUS_EXPORT dbus_bool_t dbus_connection_get_is_authenticated (DBusConnection *connection); DBUS_EXPORT dbus_bool_t dbus_connection_set_is_authenticated (DBusConnection *connection); diff --git a/dbus/dbus-transport-kdbus.c b/dbus/dbus-transport-kdbus.c index 42f0c7b..fd5e091 100644 --- a/dbus/dbus-transport-kdbus.c +++ b/dbus/dbus-transport-kdbus.c @@ -2752,17 +2752,37 @@ int bus_request_name_kdbus(DBusConnection *connection, const char *name, const u /** * Checks if the connection's transport is kdbus on the basis of its address + * saves result in DBusConnection for performance. * * @param pointer to the connection * @returns TRUE if kdbus transport, otherwise FALSE */ dbus_bool_t dbus_transport_is_kdbus(DBusConnection *connection) { - const char* address = _dbus_connection_get_address(connection); + unsigned int is_kdbus; - if(address) - if(address == strstr(address, "kdbus:path=")) + is_kdbus = dbus_connection_get_is_kdbus(connection); + if(is_kdbus == 0) + { + const char* address = _dbus_connection_get_address(connection); + + if(address) + { + if(address == strstr(address, "kdbus:path=")) + { + dbus_connection_set_is_kdbus(connection, 2); return TRUE; + } else { + dbus_connection_set_is_kdbus(connection, 1); + return FALSE; + } + } + } + + if(is_kdbus == 2) return TRUE; + if(is_kdbus == 1) return FALSE; + + _dbus_verbose("is_kdbus is not 0 or 1 or 2. Should not happen! \n"); return FALSE; } -- 2.7.4