static GSList *driver_list = NULL;
static GThreadPool *driver_thread;
-static GStaticMutex element_mutex = G_STATIC_MUTEX_INIT;
+static GStaticRWLock element_lock = G_STATIC_RW_LOCK_INIT;
static GNode *element_root = NULL;
static GThreadPool *element_thread;
DBG("");
- g_static_mutex_lock(&element_mutex);
+ g_static_rw_lock_reader_lock(&element_lock);
g_node_traverse(element_root, G_PRE_ORDER, G_TRAVERSE_ALL, -1,
append_path, &filter);
- g_static_mutex_unlock(&element_mutex);
+ g_static_rw_lock_reader_unlock(&element_lock);
}
static gint compare_priority(gconstpointer a, gconstpointer b)
{
DBG("driver %p name %s", driver, driver->name);
- g_static_mutex_lock(&element_mutex);
+ g_static_rw_lock_reader_lock(&element_lock);
g_node_traverse(element_root, G_POST_ORDER, G_TRAVERSE_ALL, -1,
remove_driver, driver);
- g_static_mutex_unlock(&element_mutex);
+ g_static_rw_lock_reader_unlock(&element_lock);
g_static_rw_lock_writer_lock(&driver_lock);
driver_list = g_slist_remove(driver_list, driver);
if (connman_element_ref(element) == NULL)
return -1;
- g_static_mutex_lock(&element_mutex);
+ g_static_rw_lock_writer_lock(&element_lock);
if (parent) {
node = g_node_find(element_root, G_PRE_ORDER,
g_node_append_data(node, element);
- g_static_mutex_unlock(&element_mutex);
+ g_static_rw_lock_writer_unlock(&element_lock);
g_dbus_register_interface(connection, element->path,
CONNMAN_ELEMENT_INTERFACE,
g_dbus_unregister_interface(connection, element->path,
CONNMAN_ELEMENT_INTERFACE);
- g_static_mutex_lock(&element_mutex);
+ g_static_rw_lock_writer_lock(&element_lock);
if (element->driver) {
if (element->driver->remove)
g_node_destroy(node);
}
- g_static_mutex_unlock(&element_mutex);
+ g_static_rw_lock_writer_unlock(&element_lock);
connman_element_unref(element);
}
{
DBG("element %p name %s", element, element->name);
- g_static_mutex_lock(&element_mutex);
+ g_static_rw_lock_reader_lock(&element_lock);
if (element->driver && element->driver->update)
element->driver->update(element);
- g_static_mutex_unlock(&element_mutex);
+ g_static_rw_lock_reader_unlock(&element_lock);
g_dbus_emit_signal(connection, CONNMAN_MANAGER_PATH,
CONNMAN_MANAGER_INTERFACE, "ElementUpdated",
static inline void set_driver(struct connman_element *element,
struct connman_driver *driver)
{
- g_static_mutex_lock(&element_mutex);
+ g_static_rw_lock_reader_lock(&element_lock);
element->driver = driver;
- g_static_mutex_unlock(&element_mutex);
+ g_static_rw_lock_reader_unlock(&element_lock);
}
static gboolean match_driver(struct connman_element *element,
DBG("driver %p name %s", driver, driver->name);
- g_static_mutex_lock(&element_mutex);
+ g_static_rw_lock_reader_lock(&element_lock);
g_node_traverse(element_root, G_PRE_ORDER, G_TRAVERSE_ALL, -1,
probe_driver, driver);
- g_static_mutex_unlock(&element_mutex);
+ g_static_rw_lock_reader_unlock(&element_lock);
}
static void element_probe(gpointer data, gpointer user_data)
if (connection == NULL)
return -EIO;
- g_static_mutex_lock(&element_mutex);
+ g_static_rw_lock_writer_lock(&element_lock);
element = connman_element_create();
element_root = g_node_new(element);
- g_static_mutex_unlock(&element_mutex);
+ g_static_rw_lock_writer_unlock(&element_lock);
element_thread = g_thread_pool_new(element_probe, NULL, 1, FALSE, NULL);
g_thread_pool_free(element_thread, TRUE, TRUE);
- g_static_mutex_lock(&element_mutex);
+ g_static_rw_lock_writer_lock(&element_lock);
g_node_traverse(element_root, G_POST_ORDER, G_TRAVERSE_ALL, -1,
free_node, NULL);
g_node_destroy(element_root);
element_root = NULL;
- g_static_mutex_unlock(&element_mutex);
+ g_static_rw_lock_writer_unlock(&element_lock);
dbus_connection_unref(connection);
}