Index: webrtc/call/call.cc |
diff --git a/webrtc/call/call.cc b/webrtc/call/call.cc |
index 25dcf32a620c48965c22077d8c6d35cc3b298267..110a7d6847955a517513b46e1bd6ee616c86a607 100644 |
--- a/webrtc/call/call.cc |
+++ b/webrtc/call/call.cc |
@@ -436,17 +436,20 @@ |
call_stats_->RegisterStatsObserver(&receive_side_cc_); |
call_stats_->RegisterStatsObserver(transport_send_->send_side_cc()); |
- module_process_thread_->Start(); |
+ // We have to attach the pacer to the pacer thread before starting the |
+ // module process thread to avoid a race accessing the process thread |
+ // both from the process thread and the pacer thread. |
+ pacer_thread_->RegisterModule(transport_send_->send_side_cc()->pacer(), |
+ RTC_FROM_HERE); |
+ pacer_thread_->RegisterModule( |
+ receive_side_cc_.GetRemoteBitrateEstimator(true), RTC_FROM_HERE); |
+ pacer_thread_->Start(); |
+ |
module_process_thread_->RegisterModule(call_stats_.get(), RTC_FROM_HERE); |
module_process_thread_->RegisterModule(&receive_side_cc_, RTC_FROM_HERE); |
module_process_thread_->RegisterModule(transport_send_->send_side_cc(), |
RTC_FROM_HERE); |
- pacer_thread_->RegisterModule(transport_send_->send_side_cc()->pacer(), |
- RTC_FROM_HERE); |
- pacer_thread_->RegisterModule( |
- receive_side_cc_.GetRemoteBitrateEstimator(true), RTC_FROM_HERE); |
- |
- pacer_thread_->Start(); |
+ module_process_thread_->Start(); |
} |
Call::~Call() { |
@@ -458,11 +461,15 @@ |
RTC_CHECK(audio_receive_streams_.empty()); |
RTC_CHECK(video_receive_streams_.empty()); |
+ // The send-side congestion controller must be de-registered prior to |
+ // the pacer thread being stopped to avoid a race when accessing the |
+ // pacer thread object on the module process thread at the same time as |
+ // the pacer thread is stopped. |
+ module_process_thread_->DeRegisterModule(transport_send_->send_side_cc()); |
pacer_thread_->Stop(); |
pacer_thread_->DeRegisterModule(transport_send_->send_side_cc()->pacer()); |
pacer_thread_->DeRegisterModule( |
receive_side_cc_.GetRemoteBitrateEstimator(true)); |
- module_process_thread_->DeRegisterModule(transport_send_->send_side_cc()); |
module_process_thread_->DeRegisterModule(&receive_side_cc_); |
module_process_thread_->DeRegisterModule(call_stats_.get()); |
module_process_thread_->Stop(); |