fix ‘pure virtual’ crash at exit.

Finally tracked down.
AudioEngine::instance()->Halted.connect_same_thread() .. call_slot().
Since the calling thread has (eg JACK) has no event loop: crash

__cxa_pure_virtual + 18
PBD::EventLoop::invalidate_request(void*) + 61 (event_loop.cc:71)
sigc::trackable::notify_callbacks() + 63
BaseUI::~BaseUI() + 173 (base_ui.cc:64)
AbstractUI<Gtkmm2ext::UIRequest>::~AbstractUI() + 137 (abstract_ui.h:59)
Gtkmm2ext::UI::~UI() + 279 (gtk_ui.cc:131)
ARDOUR_UI::~ARDOUR_UI() + 3556
ARDOUR_UI::~ARDOUR_UI() + 21
ARDOUR_UI::~ARDOUR_UI() + 25
main + 2396  

at event_loop.cc:71
    Glib::Threads::Mutex::Lock lm (ir->event_loop->slot_invalidation_mutex());
print *ir->event_loop
    (PBD::EventLoop) $1 = {}

see  http://pastebin.com/zvWJbqwf for a call_slot call on OSX/Coreaudio.
This commit is contained in:
Robin Gareus
2015-03-09 02:27:36 +01:00
parent c12b7bc9d8
commit 59f12bd31a

View File

@@ -439,7 +439,7 @@ ARDOUR_UI::engine_halted (const char* reason, bool free_reason)
free it later.
*/
char *copy = strdup (reason);
Gtkmm2ext::UI::instance()->call_slot (invalidator (*this), boost::bind (&ARDOUR_UI::engine_halted, this, copy, true));
Gtkmm2ext::UI::instance()->call_slot (MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::engine_halted, this, copy, true));
return;
}