Fix a rare EventList race-condition/crash
authorRobin Gareus <robin@gareus.org>
Thu, 17 Oct 2019 23:41:18 +0000 (01:41 +0200)
committerRobin Gareus <robin@gareus.org>
Thu, 17 Oct 2019 23:41:18 +0000 (01:41 +0200)
commitb4cbee724e6afd61519b3debdecdf41aca1447bc
treea837d4f661a067dd9a992bfbb03d9a08a9af734e
parent88f9aaff7d974faad9d1993cb966df2c1388d256
Fix a rare EventList race-condition/crash

The GUI thread may modify fade-in/out while the butler-thread
reads audio.

e.g. select a Range and click delete.
---
Thread 0:: Dispatch queue: com.apple.main-thread
0   libsystem_pthread.dylib           0x00007fffd45924fc pthread_mutex_lock + 0
1   libglib-2.0.0.dylib               0x00000001085a9d2a g_mutex_lock + 26
2   libevoral.dylib                   0x0000000107fd0a49 PBD::Signal0<void, PBD::OptionalLastValue<void> >::operator()() + 57
3   libevoral.dylib                   0x0000000107fd486d Evoral::ControlList::clear() + 253
4   libardour.dylib                   0x00000001072ef9a5 ARDOUR::AudioRegion::set_fade_out(ARDOUR::FadeShape, long long) + 309
5   libardour.dylib                   0x00000001072f19ea ARDOUR::AudioRegion::recompute_at_end() + 122
6   libpbd.dylib                      0x00000001082993ff PBD::Stateful::resume_property_changes() + 191
7   libardour.dylib                   0x00000001076476af ARDOUR::Playlist::cut(long long, long long, bool) + 575
8   libardour.dylib                   0x0000000107646b5b ARDOUR::Playlist::cut_copy(boost::shared_ptr<ARDOUR::Playlist> (ARDOUR::Playlist::*)(long long, long long, bool), std::__1::list<ARDOUR::AudioRange, std::__1::allocator<ARDOUR::AudioRange> >&, bool) + 187
9   libardour.dylib                   0x0000000107647461 ARDOUR::Playlist::cut(std::__1::list<ARDOUR::AudioRange, std::__1::allocator<ARDOUR::AudioRange> >&, bool) + 33
10  Ardour.bin                        0x00000001065f0fa0 RouteTimeAxisView::cut_copy_clear(Selection&, Editing::CutCopyOp) + 592
11  Ardour.bin                        0x0000000106118a94 Editor::cut_copy_ranges(Editing::CutCopyOp) + 164
12  Ardour.bin                        0x0000000106116053 Editor::cut_copy(Editing::CutCopyOp) + 1587

Thread 20 Crashed:
0   libardour.dylib                   0x00000001072f4b19 ARDOUR::AudioRegion::body_range() const + 89
1   libardour.dylib                   0x00000001072bd318 ARDOUR::AudioPlaylist::read(float*, float*, float*, long long, long long, unsigned int) + 1176
2   libardour.dylib                   0x00000001072ac236 ARDOUR::AudioDiskstream::read(float*, float*, float*, long long&, long long, int, bool) + 854
3   libardour.dylib                   0x00000001072abbb8 ARDOUR::AudioDiskstream::overwrite_existing_buffers() + 392
4   libardour.dylib                   0x00000001077ef36a ARDOUR::Session::non_realtime_overwrite(int, bool&) + 186
5   libardour.dylib                   0x00000001077ed7f0 ARDOUR::Session::butler_transport_work() + 1696
6   libardour.dylib                   0x0000000107323425 ARDOUR::Butler::thread_work() + 149
7   libardour.dylib                   0x000000010732334f ARDOUR::Butler::_thread_work(void*) + 95
libs/ardour/audioregion.cc