X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fpbd%2Fcrossthread.posix.cc;h=573671ba995801302441c19b1da4d3234175a921;hb=c4fcb12d128857a0eaab7d2093d38fdf4cc641cc;hp=6dbca9dcec148ab4832e7097c77d100eda171316;hpb=d7727a77e0b19ecb2d1957d1e13d554dbed58243;p=ardour.git diff --git a/libs/pbd/crossthread.posix.cc b/libs/pbd/crossthread.posix.cc index 6dbca9dcec..573671ba99 100644 --- a/libs/pbd/crossthread.posix.cc +++ b/libs/pbd/crossthread.posix.cc @@ -2,6 +2,7 @@ CrossThreadChannel::CrossThreadChannel (bool non_blocking) : receive_channel (0) + , receive_source (0) { fds[0] = -1; fds[1] = -1; @@ -16,7 +17,7 @@ CrossThreadChannel::CrossThreadChannel (bool non_blocking) error << "cannot set non-blocking mode for x-thread pipe (read) (" << ::strerror (errno) << ')' << endmsg; return; } - + if (fcntl (fds[1], F_SETFL, O_NONBLOCK)) { error << "cannot set non-blocking mode for x-thread pipe (write) (%2)" << ::strerror (errno) << ')' << endmsg; return; @@ -28,19 +29,28 @@ CrossThreadChannel::CrossThreadChannel (bool non_blocking) CrossThreadChannel::~CrossThreadChannel () { - if (receive_channel) { + 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; } if (fds[0] >= 0) { close (fds[0]); fds[0] = -1; - } + } if (fds[1] >= 0) { close (fds[1]); fds[1] = -1; - } + } } void @@ -87,7 +97,7 @@ CrossThreadChannel::poll_for_request() return false; } -int +int CrossThreadChannel::receive (char& msg, bool wait) { if (wait) {