summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2016-05-16 02:49:18 +0200
committerRobin Gareus <robin@gareus.org>2016-05-16 02:49:18 +0200
commit1b570d98861ba476ebd3fb9c066304973753c600 (patch)
tree579a822f2423d76c4a861bcfa451e904c2622e1f
parent89361e08337c4179f432c9e9712e02e014d3891c (diff)
peak_amplitude_thread fix - #6807
On windows AudioRegionEditor d'tor never returns, stalling or crashing in pthread_join() after pthread_cancel(). Crashes happen if two thread pools with the same name exist. (but since the thread has no event loop, no pool is needed) After showing Region Properties any operation that would close the dialog will either cause the application to hang indefinitely or terminate. This also consolidates code: CrossThreadChannel works on windows these days
-rw-r--r--gtk2_ardour/audio_region_editor.cc34
-rw-r--r--gtk2_ardour/audio_region_editor.h9
2 files changed, 11 insertions, 32 deletions
diff --git a/gtk2_ardour/audio_region_editor.cc b/gtk2_ardour/audio_region_editor.cc
index 3446f58eee..a5890a656a 100644
--- a/gtk2_ardour/audio_region_editor.cc
+++ b/gtk2_ardour/audio_region_editor.cc
@@ -43,7 +43,6 @@ using namespace Gtkmm2ext;
static void *
_peak_amplitude_thread (void* arg)
{
- SessionEvent::create_per_thread_pool ("peak amplitude events", 64);
static_cast<AudioRegionEditor*>(arg)->peak_amplitude_thread ();
return 0;
}
@@ -52,11 +51,7 @@ AudioRegionEditor::AudioRegionEditor (Session* s, boost::shared_ptr<AudioRegion>
: RegionEditor (s, r)
, _audio_region (r)
, gain_adjustment(accurate_coefficient_to_dB(_audio_region->scale_amplitude()), -40.0, +40.0, 0.1, 1.0, 0)
-#ifdef PLATFORM_WINDOWS
- , m_peak_sem ("peak_semaphore", 0)
-#else
, _peak_channel (false)
-#endif
{
Gtk::HBox* b = Gtk::manage (new Gtk::HBox);
@@ -92,14 +87,17 @@ AudioRegionEditor::AudioRegionEditor (Session* s, boost::shared_ptr<AudioRegion>
_peak_amplitude.set_text (_("Calculating..."));
PeakAmplitudeFound.connect (_peak_amplitude_connection, invalidator (*this), boost::bind (&AudioRegionEditor::peak_amplitude_found, this, _1), gui_context ());
- pthread_create_and_store (X_("peak-amplitude"), &_peak_amplitude_thread_handle, _peak_amplitude_thread, this);
+
+ char name[64];
+ snprintf (name, 64, "peak amplitude-%p", this);
+ pthread_create_and_store (name, &_peak_amplitude_thread_handle, _peak_amplitude_thread, this);
signal_peak_thread ();
}
AudioRegionEditor::~AudioRegionEditor ()
{
void* v;
- pthread_cancel_one (_peak_amplitude_thread_handle);
+ _peak_channel.deliver ('t');
pthread_join (_peak_amplitude_thread_handle, &v);
}
@@ -138,30 +136,20 @@ AudioRegionEditor::gain_adjustment_changed ()
void
AudioRegionEditor::signal_peak_thread ()
{
-#ifdef PLATFORM_WINDOWS
- m_peak_sem.signal ();
-#else
_peak_channel.deliver ('c');
-#endif
-}
-
-void
-AudioRegionEditor::wait_for_signal ()
-{
-#ifdef PLATFORM_WINDOWS
- m_peak_sem.wait ();
-#else
- char msg;
- _peak_channel.receive (msg);
-#endif
}
void
AudioRegionEditor::peak_amplitude_thread ()
{
while (1) {
+ char msg;
/* await instructions to run */
- wait_for_signal ();
+ _peak_channel.receive (msg);
+
+ if (msg == 't') {
+ break;
+ }
/* compute peak amplitude and signal the fact */
PeakAmplitudeFound (accurate_coefficient_to_dB (_audio_region->maximum_amplitude ())); /* EMIT SIGNAL */
diff --git a/gtk2_ardour/audio_region_editor.h b/gtk2_ardour/audio_region_editor.h
index dd726bdd54..083a39dfbc 100644
--- a/gtk2_ardour/audio_region_editor.h
+++ b/gtk2_ardour/audio_region_editor.h
@@ -36,11 +36,7 @@
#include "pbd/signals.h"
-#ifdef PLATFORM_WINDOWS
-#include "pbd/semutils.h"
-#else
#include "pbd/crossthread.h"
-#endif
#include "audio_clock.h"
#include "ardour_dialog.h"
@@ -78,16 +74,11 @@ class AudioRegionEditor : public RegionEditor
Gtk::Entry _peak_amplitude;
void signal_peak_thread ();
- void wait_for_signal ();
pthread_t _peak_amplitude_thread_handle;
void peak_amplitude_found (double);
PBD::Signal1<void, double> PeakAmplitudeFound;
PBD::ScopedConnection _peak_amplitude_connection;
-#ifdef PLATFORM_WINDOWS
- PBD::Semaphore m_peak_sem;
-#else
CrossThreadChannel _peak_channel;
-#endif
};
#endif /* __gtk_ardour_audio_region_edit_h__ */