[gnome-bluetooth] client: Disconnect all signal handlers when client is disposed
- From: Bastien Nocera <hadess src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-bluetooth] client: Disconnect all signal handlers when client is disposed
- Date: Sun, 18 Aug 2019 15:28:21 +0000 (UTC)
commit 9c94e30c70f64fc0c067e2225f82d88f31e3dca3
Author: Simon McVittie <smcv debian org>
Date: Tue Aug 13 15:53:49 2019 +0100
client: Disconnect all signal handlers when client is disposed
I've encountered an intermittent GNOME Shell crash when needrestart[1]
is allowed to restart system services that are using outdated shared
libraries, which sometimes includes BlueZ. The crash seems to involve
signals being delivered to a freed BluetoothClient, which can be avoided
by using g_signal_connect_object(). I haven't encountered the crash
since applying this change, although since it was always intermittent
I cannot be sure that it is fully solved.
This might be caused by using the Bluetooth Quick Connect shell
extension[2], which will create and destroy a BluetoothClient when the
extension is loaded and unloaded, which will in turn happen when the
screen is locked (due to extensions being disabled in the lock screen).
[1] https://github.com/liske/needrestart
[2] https://extensions.gnome.org/extension/1401/bluetooth-quick-connect/
Signed-off-by: Simon McVittie <smcv debian org>
Bug-Debian: https://bugs.debian.org/932405
lib/bluetooth-client.c | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
---
diff --git a/lib/bluetooth-client.c b/lib/bluetooth-client.c
index bb4dc3ea..089fbb5f 100644
--- a/lib/bluetooth-client.c
+++ b/lib/bluetooth-client.c
@@ -392,8 +392,8 @@ device_added (GDBusObjectManager *manager,
BluetoothType type;
GtkTreeIter iter, parent;
- g_signal_connect (G_OBJECT (device), "notify",
- G_CALLBACK (device_notify_cb), client);
+ g_signal_connect_object (G_OBJECT (device), "notify",
+ G_CALLBACK (device_notify_cb), client, 0);
adapter_path = device1_get_adapter (device);
address = device1_get_address (device);
@@ -608,8 +608,8 @@ adapter_added (GDBusObjectManager *manager,
const gchar *address, *name;
gboolean discovering, discoverable, powered;
- g_signal_connect (G_OBJECT (adapter), "notify",
- G_CALLBACK (adapter_notify_cb), client);
+ g_signal_connect_object (G_OBJECT (adapter), "notify",
+ G_CALLBACK (adapter_notify_cb), client, 0);
address = adapter1_get_address (adapter);
name = adapter1_get_name (adapter);
@@ -798,11 +798,11 @@ object_manager_new_callback(GObject *source_object,
priv = BLUETOOTH_CLIENT_GET_PRIVATE(client);
priv->manager = manager;
- g_signal_connect (G_OBJECT (priv->manager), "interface-added", (GCallback) interface_added, client);
- g_signal_connect (G_OBJECT (priv->manager), "interface-removed", (GCallback) interface_removed,
client);
+ g_signal_connect_object (G_OBJECT (priv->manager), "interface-added", (GCallback) interface_added,
client, 0);
+ g_signal_connect_object (G_OBJECT (priv->manager), "interface-removed", (GCallback)
interface_removed, client, 0);
- g_signal_connect (G_OBJECT (priv->manager), "object-added", (GCallback) object_added, client);
- g_signal_connect (G_OBJECT (priv->manager), "object-removed", (GCallback) object_removed, client);
+ g_signal_connect_object (G_OBJECT (priv->manager), "object-added", (GCallback) object_added, client,
0);
+ g_signal_connect_object (G_OBJECT (priv->manager), "object-removed", (GCallback) object_removed,
client, 0);
object_list = g_dbus_object_manager_get_objects (priv->manager);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]