From 03660573e28dbc3574d5964cc0392832b8f46557 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Sat, 21 May 2016 23:30:11 +0200 Subject: [PATCH] fix import-thread SNAFU * pressing Esc or WM close button did not cancel import thread * proper Abort does not wait for import thread either It was possible to launch a 2nd (and Nth) import thread, all sharing the Editor's ImportStatus data-structure, all having the same registered thread-name and same thread-pool name. Plenty of room for crashes. --- gtk2_ardour/editor_audio_import.cc | 5 ++++- gtk2_ardour/interthread_progress_window.cc | 8 ++++++++ gtk2_ardour/interthread_progress_window.h | 1 + 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/gtk2_ardour/editor_audio_import.cc b/gtk2_ardour/editor_audio_import.cc index ced2e7cb3d..e35e566dee 100644 --- a/gtk2_ardour/editor_audio_import.cc +++ b/gtk2_ardour/editor_audio_import.cc @@ -507,7 +507,10 @@ Editor::import_sndfiles (vector paths, gtk_main_iteration (); } - import_status.done = true; + // wait for thread to terminate + while (!import_status.done) { + gtk_main_iteration (); + } int result = -1; diff --git a/gtk2_ardour/interthread_progress_window.cc b/gtk2_ardour/interthread_progress_window.cc index e63bf629a9..2f64644d5d 100644 --- a/gtk2_ardour/interthread_progress_window.cc +++ b/gtk2_ardour/interthread_progress_window.cc @@ -55,6 +55,14 @@ InterthreadProgressWindow::InterthreadProgressWindow (ARDOUR::InterThreadInfo* i Glib::signal_timeout().connect (sigc::mem_fun (*this, &InterthreadProgressWindow::update), 100); } +void +InterthreadProgressWindow::on_hide () +{ + if (!_interthread_info->done) { + _interthread_info->cancel = true; + } +} + void InterthreadProgressWindow::cancel_clicked () { diff --git a/gtk2_ardour/interthread_progress_window.h b/gtk2_ardour/interthread_progress_window.h index 653ec46420..ee7b58ee16 100644 --- a/gtk2_ardour/interthread_progress_window.h +++ b/gtk2_ardour/interthread_progress_window.h @@ -42,6 +42,7 @@ public: protected: virtual bool update (); + virtual void on_hide (); Gtk::Button _cancel_button; Gtk::Label _cancel_label;