summaryrefslogtreecommitdiff
path: root/libs/pbd
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2016-10-17 14:48:15 -0400
committerPaul Davis <paul@linuxaudiosystems.com>2016-10-17 14:48:15 -0400
commit8519677a240ec3593b16e286367405873534e339 (patch)
tree259f6ee083cfe96fa76d1136cb9402adb4127a3d /libs/pbd
parent157253c2c633c184bb09edf3de30dd283b0ec506 (diff)
fix potentially crash-inducing race condition by removing event loops' x-thread channel from an event loop when it is destroyed
Diffstat (limited to 'libs/pbd')
-rw-r--r--libs/pbd/crossthread.posix.cc8
-rw-r--r--libs/pbd/crossthread.win.cc8
2 files changed, 16 insertions, 0 deletions
diff --git a/libs/pbd/crossthread.posix.cc b/libs/pbd/crossthread.posix.cc
index 5035bc49da..573671ba99 100644
--- a/libs/pbd/crossthread.posix.cc
+++ b/libs/pbd/crossthread.posix.cc
@@ -29,6 +29,14 @@ CrossThreadChannel::CrossThreadChannel (bool non_blocking)
CrossThreadChannel::~CrossThreadChannel ()
{
+ if (receive_source) {
+ /* this disconnects it from any main context it was attached in
+ in ::attach(), this prevent its callback from being invoked
+ after the destructor has finished.
+ */
+ g_source_destroy (receive_source);
+ }
+
if (receive_channel) {
g_io_channel_unref (receive_channel);
receive_channel = 0;
diff --git a/libs/pbd/crossthread.win.cc b/libs/pbd/crossthread.win.cc
index 5eca5fb4e8..60572bde70 100644
--- a/libs/pbd/crossthread.win.cc
+++ b/libs/pbd/crossthread.win.cc
@@ -89,6 +89,14 @@ CrossThreadChannel::CrossThreadChannel (bool non_blocking)
CrossThreadChannel::~CrossThreadChannel ()
{
+ if (receive_source) {
+ /* this disconnects it from any main context it was attached in
+ in ::attach(), this prevent its callback from being invoked
+ after the destructor has finished.
+ */
+ g_source_destroy (receive_source);
+ }
+
/* glibmm hack */
if (receive_channel) {