summaryrefslogtreecommitdiff
path: root/libs/ardour/playlist.cc
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2015-10-12 01:54:44 +0200
committerRobin Gareus <robin@gareus.org>2015-10-12 02:11:04 +0200
commit27f57cde9ad5782dfb2a16fa0520d67b9e5ed4d4 (patch)
treeb9c0218cf3cff518642f9b0f7e9b39e72c2dc6cb /libs/ardour/playlist.cc
parent86f8b9e12dcd95ef8ba27279ef72e8fb7b19091d (diff)
fix crashes due to glib ignored EDEADLK.
Taking a readlock after a writelock in the same thread should result in a deadlock, yet pthread on Linux returns EDEADLK and continues. glib-2.42.0 ignores EDEADLK and assumes the lock was taken. Releasing the lock later causes issues: "Calling g_rw_lock_writer_unlock() on a lock that is not held by the current thread leads to undefined behaviour." The issue at hand: AudioStreamView::redisplay_track() -> foreach_region() #<< WriteLock -> add_region_view() ... -> AudioRegionView::create_one_wave() -> RegionView::update_coverage_frames -> Playlist::top_unmuted_region_at() #<< ReadLock All current users of Playlist::foreach_region() are in the GUI and AFAICT read-only (display regions, update visuals)
Diffstat (limited to 'libs/ardour/playlist.cc')
-rw-r--r--libs/ardour/playlist.cc2
1 files changed, 1 insertions, 1 deletions
diff --git a/libs/ardour/playlist.cc b/libs/ardour/playlist.cc
index 959b4884a3..0e58b4b622 100644
--- a/libs/ardour/playlist.cc
+++ b/libs/ardour/playlist.cc
@@ -2841,7 +2841,7 @@ Playlist::update_after_tempo_map_change ()
void
Playlist::foreach_region (boost::function<void(boost::shared_ptr<Region>)> s)
{
- RegionWriteLock rl (this, false);
+ RegionReadLock rl (this);
for (RegionList::iterator i = regions.begin(); i != regions.end(); ++i) {
s (*i);
}