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:
parent
86f8b9e12d
commit
27f57cde9a
@ -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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user