another (non critical) concurrency issue:
authorRobin Gareus <robin@gareus.org>
Tue, 3 May 2016 11:56:08 +0000 (13:56 +0200)
committerRobin Gareus <robin@gareus.org>
Tue, 3 May 2016 12:27:52 +0000 (14:27 +0200)
Ignore latency-updates while removing tracks.

remove_tracks() calls disconnect_all() which can trigger the backend
to perform a latency-recompute in a different thread (process thread).
That calls Session::update_latency() which iterates over all routes
including the one(s) to be deleted.

At the same time disconnect_all() may propagate Port::PostDisconnect()
leading to a lock contention.

(no crash just a lot of unnecessary work. remove_routes() calls
update_latency_compensation() which triggers a recompute if needed)

libs/ardour/session.cc

index 68c7d3957fdc8f99c5487a57031a4c505b29fb4a..718b68279dd8af54322525fd462e7324fea0e8d9 100644 (file)
@@ -6403,9 +6403,10 @@ Session::unknown_processors () const
 void
 Session::update_latency (bool playback)
 {
+
        DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
 
-       if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress) {
+       if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress || _route_deletion_in_progress) {
                return;
        }