13
0

Fix recursive WriteLock crash due to signal emission

Route::processors_changed() signal connects to a same thread session-slot
Session::route_processors_changed() which can end up iterating over
Routes and Processors to re-calculate latency.
This takes a ReadLock after WriteLock, which eventually leads a duplicate
unlock and segfault.
This commit is contained in:
Robin Gareus 2019-03-05 00:25:53 +01:00
parent bb6408d553
commit 2cf57e9257
Signed by: rgareus
GPG Key ID: A090BCE02CF57F04

View File

@ -3896,16 +3896,18 @@ Route::set_meter_point (MeterPoint p, bool force)
}
if (force || !AudioEngine::instance()->running()) {
Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
Glib::Threads::RWLock::WriterLock lm (_processor_lock);
_pending_meter_point = p;
bool meter_visibly_changed = false;
{
Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
Glib::Threads::RWLock::WriterLock lm (_processor_lock);
_pending_meter_point = p;
if (set_meter_point_unlocked ()) {
meter_visibly_changed = true;
}
}
_meter->emit_configuration_changed();
meter_change (); /* EMIT SIGNAL */
if (set_meter_point_unlocked()) {
processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, true)); /* EMIT SIGNAL */
} else {
processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, false)); /* EMIT SIGNAL */
}
processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, meter_visibly_changed)); /* EMIT SIGNAL */
} else {
_pending_meter_point = p;
}