hal: Branch 'master'
Danny Kukawka
dkukawka at kemper.freedesktop.org
Mon Aug 25 03:55:03 PDT 2008
hald/hald_dbus.c | 67 +++++++++++++++++++++++++++++++++++++++++--------------
1 file changed, 51 insertions(+), 16 deletions(-)
New commits:
commit bdfc7b395872e0b9455752b48f88f6776f15ebb9
Author: Danny Kukawka <danny.kukawka at web.de>
Date: Mon Aug 25 12:54:08 2008 +0200
fixed Lock() handling
Fixed Lock() handling.
The current code store the lock information for a lock owner into a
hash-table with these info: key=service_name of the lock owner and
as value the device which was locked. Unfortunately this don't work
if a service request more than one lock, because the old one get
overwritten in the hash table. Use instead of the device a GSList
with devices. This should solve
If the lock owner dies, remove the locks of the old_service_name and
not of the new_service_name (otherwise the locks get never released).
diff --git a/hald/hald_dbus.c b/hald/hald_dbus.c
index 6889275..51dd7ae 100644
--- a/hald/hald_dbus.c
+++ b/hald/hald_dbus.c
@@ -2580,6 +2580,51 @@ device_release_global_interface_lock (DBusConnection *connection, DBusMessage *m
static GHashTable *services_with_locks = NULL;
+static void
+services_with_locks_add_lock (const char* lock_owner, HalDevice *device) {
+
+ GSList *devices;
+
+ devices = g_hash_table_lookup (services_with_locks, lock_owner);
+
+ devices = g_slist_prepend (devices, device);
+
+ g_hash_table_insert (services_with_locks, strdup(lock_owner), devices);
+}
+
+static void
+services_with_locks_remove_lock (const char* lock_owner, HalDevice *device) {
+
+ GSList *devices;
+
+ devices = g_hash_table_lookup (services_with_locks, lock_owner);
+
+ devices = g_slist_remove (devices, device);
+
+ g_hash_table_insert (services_with_locks, strdup(lock_owner), devices);
+}
+
+static void
+services_with_locks_remove_lockowner (const char* lock_owner) {
+
+ GSList *devices;
+
+ devices = g_hash_table_lookup (services_with_locks, lock_owner);
+
+ if (devices != NULL) {
+ GSList *iter;
+
+ for (iter = devices; iter != NULL; iter = iter->next) {
+ HalDevice *d = iter->data;
+ hal_device_property_remove (d, "info.locked");
+ hal_device_property_remove (d, "info.locked.reason");
+ hal_device_property_remove (d, "info.locked.dbus_name");
+ }
+ }
+ g_hash_table_remove (services_with_locks, lock_owner);
+}
+
+
/**
* device_lock:
* @connection: D-BUS connection
@@ -2655,8 +2700,7 @@ device_lock (DBusConnection * connection,
g_object_unref);
}
- g_hash_table_insert (services_with_locks, g_strdup (sender),
- g_object_ref (d));
+ services_with_locks_add_lock (sender, d);
if (!dbus_connection_send (connection, reply, NULL))
DIE (("No memory"));
@@ -2741,9 +2785,9 @@ device_unlock (DBusConnection *connection,
return DBUS_HANDLER_RESULT_HANDLED;
}
- if (g_hash_table_lookup (services_with_locks, sender))
- g_hash_table_remove (services_with_locks, sender);
- else {
+ if (g_hash_table_lookup (services_with_locks, sender)) {
+ services_with_locks_remove_lock (sender, d);
+ } else {
HAL_WARNING (("Service '%s' was not in the list of services "
"with locks!", sender));
}
@@ -5181,7 +5225,6 @@ hald_dbus_filter_function (DBusConnection * connection,
char *name;
char *old_service_name;
char *new_service_name;
- HalDevice *d;
if (!dbus_message_get_args (message, NULL,
DBUS_TYPE_STRING, &name,
@@ -5196,16 +5239,8 @@ hald_dbus_filter_function (DBusConnection * connection,
ci_tracker_name_owner_changed (ci_tracker, name, old_service_name, new_service_name);
- if (services_with_locks != NULL) {
- d = g_hash_table_lookup (services_with_locks, new_service_name);
- if (d != NULL) {
- hal_device_property_remove (d, "info.locked");
- hal_device_property_remove (d, "info.locked.reason");
- hal_device_property_remove (d, "info.locked.dbus_name");
-
- g_hash_table_remove (services_with_locks, new_service_name);
- }
- }
+ if (services_with_locks != NULL)
+ services_with_locks_remove_lockowner(old_service_name);
if (strlen (old_service_name) > 0)
hal_device_client_disconnected (old_service_name);
More information about the hal-commit
mailing list