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)
This commit is contained in:
Robin Gareus 2015-10-12 01:54:44 +02:00
parent 86f8b9e12d
commit 27f57cde9a

View File

@ -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);
}