aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'hal-0.5.11-patches/0016-fixed-Lock-handling.patch')
-rw-r--r--hal-0.5.11-patches/0016-fixed-Lock-handling.patch129
1 files changed, 129 insertions, 0 deletions
diff --git a/hal-0.5.11-patches/0016-fixed-Lock-handling.patch b/hal-0.5.11-patches/0016-fixed-Lock-handling.patch
new file mode 100644
index 00000000..6fdd6faf
--- /dev/null
+++ b/hal-0.5.11-patches/0016-fixed-Lock-handling.patch
@@ -0,0 +1,129 @@
+From 0c584a62e3393b0a92c297b422c819b2d7ccde17 Mon Sep 17 00:00:00 2001
+From: Danny Kukawka <danny.kukawka@web.de>
+Date: Mon, 25 Aug 2008 12:54:08 +0200
+Subject: [PATCH 16/48] 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).
+---
+ hald/hald_dbus.c | 67 +++++++++++++++++++++++++++++++++++++++++-------------
+ 1 files changed, 51 insertions(+), 16 deletions(-)
+
+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);
+--
+1.6.1.2
+