--- 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