diff options
author | Robin Gareus <robin@gareus.org> | 2015-10-12 01:54:44 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2015-10-12 02:11:04 +0200 |
commit | 27f57cde9ad5782dfb2a16fa0520d67b9e5ed4d4 (patch) | |
tree | b9c0218cf3cff518642f9b0f7e9b39e72c2dc6cb /libs/ardour | |
parent | 86f8b9e12dcd95ef8ba27279ef72e8fb7b19091d (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')
-rw-r--r-- | libs/ardour/playlist.cc | 2 |
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); } |