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) {