---
 src/technology.c | 48 +++++++++++++++++++++++++++++++++++++-----------
 1 file changed, 37 insertions(+), 11 deletions(-)

diff --git a/src/technology.c b/src/technology.c
index 3fc7afc..6e5da01 100644
--- a/src/technology.c
+++ b/src/technology.c
@@ -72,6 +72,8 @@ struct connman_technology {
        guint pending_timeout;
 
        GSList *scan_pending;
+
+       connman_bool_t dbus_registered;
 };
 
 static GSList *driver_list = NULL;
@@ -904,6 +906,26 @@ static const GDBusSignalTable technology_signals[] = {
        { },
 };
 
+static gboolean technology_dbus_register(struct connman_technology *technology)
+{
+       if (technology->dbus_registered == TRUE)
+               return TRUE;
+
+       if (g_dbus_register_interface(connection, technology->path,
+                                       CONNMAN_TECHNOLOGY_INTERFACE,
+                                       technology_methods, technology_signals,
+                                       NULL, technology, NULL) == FALSE) {
+               connman_error("Failed to register %s", technology->path);
+               return FALSE;
+       }
+
+       technology_added_signal(technology);
+
+       technology->dbus_registered = TRUE;
+
+       return TRUE;
+}
+
 static struct connman_technology *technology_get(enum connman_service_type 
type)
 {
        struct connman_technology *technology;
@@ -956,19 +978,13 @@ static struct connman_technology *technology_get(enum 
connman_service_type type)
 
        technology_load(technology);
 
-       if (g_dbus_register_interface(connection, technology->path,
-                                       CONNMAN_TECHNOLOGY_INTERFACE,
-                                       technology_methods, technology_signals,
-                                       NULL, technology, NULL) == FALSE) {
-               connman_error("Failed to register %s", technology->path);
+       if (technology_dbus_register(technology) == FALSE) {
                g_free(technology);
                return NULL;
        }
 
        technology_list = g_slist_prepend(technology_list, technology);
 
-       technology_added_signal(technology);
-
        technology->driver = driver;
        err = driver->probe(technology);
        if (err != 0)
@@ -979,6 +995,19 @@ static struct connman_technology *technology_get(enum 
connman_service_type type)
        return technology;
 }
 
+static void technology_dbus_unregister(struct connman_technology *technology)
+{
+       if (technology->dbus_registered == FALSE)
+               return;
+
+       technology_removed_signal(technology);
+
+       g_dbus_unregister_interface(connection, technology->path,
+                                               CONNMAN_TECHNOLOGY_INTERFACE);
+
+       technology->dbus_registered = FALSE;
+}
+
 static void technology_put(struct connman_technology *technology)
 {
        DBG("technology %p", technology);
@@ -995,10 +1024,7 @@ static void technology_put(struct connman_technology 
*technology)
 
        technology_list = g_slist_remove(technology_list, technology);
 
-       technology_removed_signal(technology);
-
-       g_dbus_unregister_interface(connection, technology->path,
-                                               CONNMAN_TECHNOLOGY_INTERFACE);
+       technology_dbus_unregister(technology);
 
        g_slist_free(technology->device_list);
 
-- 
1.7.12

_______________________________________________
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman

Reply via email to