From 27f57cde9ad5782dfb2a16fa0520d67b9e5ed4d4 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Mon, 12 Oct 2015 01:54:44 +0200 Subject: [PATCH] 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) --- libs/ardour/playlist.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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)> s) { - RegionWriteLock rl (this, false); + RegionReadLock rl (this); for (RegionList::iterator i = regions.begin(); i != regions.end(); ++i) { s (*i); }