Optimization: transport_is_kdbus parses address once
authorMichal Eljasiewicz <m.eljasiewic@samsung.com>
Thu, 5 Sep 2013 10:50:46 +0000 (12:50 +0200)
committerMichal Eljasiewicz <m.eljasiewic@samsung.com>
Thu, 5 Sep 2013 10:50:46 +0000 (12:50 +0200)
Change-Id: Ic9a1afbd2ee2da175b2e100543af2fcfef0db126

dbus/dbus-connection.c
dbus/dbus-connection.h
dbus/dbus-transport-kdbus.c

index 25aaae6..7697bac 100644 (file)
@@ -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,
index d223954..de11e6d 100644 (file)
@@ -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);
index 42f0c7b..fd5e091 100644 (file)
@@ -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;
 }