diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2016-10-17 14:48:15 -0400 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2016-10-17 14:48:15 -0400 |
commit | 8519677a240ec3593b16e286367405873534e339 (patch) | |
tree | 259f6ee083cfe96fa76d1136cb9402adb4127a3d /libs/pbd | |
parent | 157253c2c633c184bb09edf3de30dd283b0ec506 (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.cc | 8 | ||||
-rw-r--r-- | libs/pbd/crossthread.win.cc | 8 |
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) { |