From b736c50d83b00955e5857383ccf2c2f197f42ce7 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Sun, 15 Oct 2023 22:43:24 +0200 Subject: [PATCH] Fix deadlock in Playlist::fade_range Region::fade_range emits a signal which will call ARDOUR::Playlist::region_bounds_changed, which takes a WriteLock. That resulted in a WriteLock with ReadLock held. --- libs/ardour/playlist.cc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libs/ardour/playlist.cc b/libs/ardour/playlist.cc index 777435e90b..d2e46174cc 100644 --- a/libs/ardour/playlist.cc +++ b/libs/ardour/playlist.cc @@ -3409,6 +3409,7 @@ Playlist::uncombine (std::shared_ptr target) void Playlist::fade_range (list& ranges) { + ThawList thawlist; RegionReadLock rlock (this); for (list::iterator r = ranges.begin(); r != ranges.end(); ) { list::iterator tmpr = r; @@ -3416,11 +3417,14 @@ Playlist::fade_range (list& ranges) for (RegionList::const_iterator i = regions.begin (); i != regions.end ();) { RegionList::const_iterator tmpi = i; ++tmpi; + thawlist.add (*i); (*i)->fade_range ((*r).start().samples(), (*r).end().samples()); i = tmpi; } r = tmpr; } + rlock.release (); + thawlist.release (); } uint32_t