static GStaticMutex ethernet_mutex = G_STATIC_MUTEX_INIT;
static GSList *ethernet_list = NULL;
-static GStaticMutex element_mutex = G_STATIC_MUTEX_INIT;
-static GSList *element_list = NULL;
-
static void create_element(struct connman_element *parent,
enum connman_element_type type)
{
element->netdev.index = parent->netdev.index;
element->netdev.name = g_strdup(parent->netdev.name);
- g_static_mutex_lock(&element_mutex);
- element_list = g_slist_append(element_list, element);
- g_static_mutex_unlock(&element_mutex);
-
connman_element_register(element, parent);
}
-static void remove_elements(struct connman_element *parent)
-{
- GSList *list = element_list;
-
- DBG("parent %p name %s", parent, parent->name);
-
- g_static_mutex_lock(&element_mutex);
-
- while (list) {
- GSList *next = list->next;
- struct connman_element *element = list->data;
-
- if (element->netdev.index != parent->netdev.index) {
- list = next;
- continue;
- }
-
- element_list = g_slist_delete_link(element_list, list);
-
- connman_element_unregister(element);
-
- connman_element_unref(element);
-
- list = next;
- }
-
- g_static_mutex_unlock(&element_mutex);
-}
-
static void rtnl_link(struct nlmsghdr *hdr, const char *type)
{
GSList *list;
} else {
DBG("carrier off");
- remove_elements(element);
+ connman_element_unregister_children(element);
}
}
iface_down(element);
- remove_elements(element);
-
g_static_mutex_lock(ðernet_mutex);
ethernet_list = g_slist_remove(ethernet_list, element);
g_static_mutex_unlock(ðernet_mutex);