From 364644b52e28091cc53b767fc869adac6b4064c8 Mon Sep 17 00:00:00 2001 From: Arkadiusz Bokowy Date: Fri, 23 Sep 2022 16:28:00 +0200 Subject: [PATCH 1/2] [Linux] Mark GLib source as removed when exiting callback Fixes #22840 --- src/platform/Linux/bluez/Helper.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/platform/Linux/bluez/Helper.cpp b/src/platform/Linux/bluez/Helper.cpp index 1337c4e69a1003..3267d5e3de3e81 100644 --- a/src/platform/Linux/bluez/Helper.cpp +++ b/src/platform/Linux/bluez/Helper.cpp @@ -401,7 +401,15 @@ static gboolean BluezCharacteristicWriteFD(GIOChannel * aChannel, GIOCondition a isSuccess = true; exit: - return isSuccess ? TRUE : FALSE; + if (!isSuccess && (conn != nullptr)) + { + // Returning G_SOURCE_REMOVE from the source callback removes the source object + // from the context. Unset self source ID tag, so we will not call g_source_remove() + // in BluezOTConnectionDestroy() on already removed source. + conn->mC1Channel.mWatch = 0; + } + + return isSuccess ? G_SOURCE_CONTINUE : G_SOURCE_REMOVE; } static void Bluez_gatt_characteristic1_complete_acquire_write_with_fd(GDBusMethodInvocation * invocation, int fd, guint16 mtu) @@ -417,6 +425,11 @@ static void Bluez_gatt_characteristic1_complete_acquire_write_with_fd(GDBusMetho static gboolean bluezCharacteristicDestroyFD(GIOChannel * aChannel, GIOCondition aCond, gpointer apClosure) { + BluezConnection * conn = static_cast(apClosure); + // Returning G_SOURCE_REMOVE from the source callback removes the source object + // from the context. Unset self source ID tag, so we will not call g_source_remove() + // in BluezOTConnectionDestroy() on already removed source. + conn->mC2Channel.mWatch = 0; return G_SOURCE_REMOVE; } From 86a39618a2d8cd0c3182a871ca31e281222dda27 Mon Sep 17 00:00:00 2001 From: Arkadiusz Bokowy Date: Fri, 30 Sep 2022 07:20:48 +0200 Subject: [PATCH 2/2] Add TODO for investigating GLib watch tag ID some more --- src/platform/Linux/bluez/Helper.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/platform/Linux/bluez/Helper.cpp b/src/platform/Linux/bluez/Helper.cpp index 3267d5e3de3e81..f65dbde49862f8 100644 --- a/src/platform/Linux/bluez/Helper.cpp +++ b/src/platform/Linux/bluez/Helper.cpp @@ -406,6 +406,8 @@ static gboolean BluezCharacteristicWriteFD(GIOChannel * aChannel, GIOCondition a // Returning G_SOURCE_REMOVE from the source callback removes the source object // from the context. Unset self source ID tag, so we will not call g_source_remove() // in BluezOTConnectionDestroy() on already removed source. + // + // TODO: Investigate whether there is a batter way to handle this. conn->mC1Channel.mWatch = 0; } @@ -429,6 +431,8 @@ static gboolean bluezCharacteristicDestroyFD(GIOChannel * aChannel, GIOCondition // Returning G_SOURCE_REMOVE from the source callback removes the source object // from the context. Unset self source ID tag, so we will not call g_source_remove() // in BluezOTConnectionDestroy() on already removed source. + // + // TODO: Investigate whether there is a batter way to handle this. conn->mC2Channel.mWatch = 0; return G_SOURCE_REMOVE; }