fix crashes due to glib ignored EDEADLK.
authorRobin Gareus <robin@gareus.org>
Sun, 11 Oct 2015 23:54:44 +0000 (01:54 +0200)
committerRobin Gareus <robin@gareus.org>
Mon, 12 Oct 2015 00:11:04 +0000 (02:11 +0200)
commit27f57cde9ad5782dfb2a16fa0520d67b9e5ed4d4
treeb9c0218cf3cff518642f9b0f7e9b39e72c2dc6cb
parent86f8b9e12dcd95ef8ba27279ef72e8fb7b19091d
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