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:
parent
bb6408d553
commit
2cf57e9257
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user