Fix for deadlock in AudioUsesAbsSendTimeExtension test.

Bug: webrtc:10904
Change-Id: Iea7814384d0e15ea8539e18732c689fafff225b0
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/151763
Commit-Queue: Sebastian Jansson <srte@webrtc.org>
Reviewed-by: Artem Titov <titovartem@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#29096}
This commit is contained in:
Sebastian Jansson
2019-09-06 10:55:26 +02:00
committed by Commit Bot
parent a3baf2a3b1
commit 059a0b7587
2 changed files with 29 additions and 7 deletions

View File

@ -137,9 +137,9 @@ PeerScenarioClient::PeerScenarioClient(NetworkEmulationManager* net,
});
handlers_.on_signaling_change.push_back(
[this](PeerConnectionInterface::SignalingState state) {
RTC_DCHECK_RUN_ON(signaling_thread_);
if (state == PeerConnectionInterface::SignalingState::kStable &&
peer_connection_->current_remote_description()) {
RTC_DCHECK_RUN_ON(signaling_thread_);
for (const auto& candidate : pending_ice_candidates_) {
RTC_CHECK(peer_connection_->AddIceCandidate(candidate.get()));
}
@ -203,6 +203,7 @@ EmulatedEndpoint* PeerScenarioClient::endpoint(int index) {
PeerScenarioClient::AudioSendTrack PeerScenarioClient::CreateAudio(
std::string track_id,
cricket::AudioOptions options) {
RTC_DCHECK_RUN_ON(signaling_thread_);
AudioSendTrack res;
auto source = pc_factory_->CreateAudioSource(options);
auto track = pc_factory_->CreateAudioTrack(track_id, source);
@ -214,6 +215,7 @@ PeerScenarioClient::AudioSendTrack PeerScenarioClient::CreateAudio(
PeerScenarioClient::VideoSendTrack PeerScenarioClient::CreateVideo(
std::string track_id,
VideoSendTrackConfig config) {
RTC_DCHECK_RUN_ON(signaling_thread_);
VideoSendTrack res;
auto capturer = FrameGeneratorCapturer::Create(clock(), *task_queue_factory_,
config.generator);
@ -237,15 +239,16 @@ void PeerScenarioClient::AddVideoReceiveSink(
void PeerScenarioClient::CreateAndSetSdp(
std::function<void(std::string)> offer_handler) {
RTC_DCHECK_RUN_ON(signaling_thread_);
peer_connection_->CreateOffer(
SdpCreateObserver([=](SessionDescriptionInterface* offer) {
RTC_DCHECK_RUN_ON(signaling_thread_);
std::string sdp_offer;
offer->ToString(&sdp_offer);
RTC_LOG(LS_INFO) << sdp_offer;
peer_connection_->SetLocalDescription(
SdpSetObserver([sdp_offer, offer_handler]() {
offer_handler(std::move(sdp_offer));
}),
SdpSetObserver(
[sdp_offer, offer_handler]() { offer_handler(sdp_offer); }),
offer);
}),
PeerConnectionInterface::RTCOfferAnswerOptions());
@ -254,11 +257,20 @@ void PeerScenarioClient::CreateAndSetSdp(
void PeerScenarioClient::SetSdpOfferAndGetAnswer(
std::string remote_offer,
std::function<void(std::string)> answer_handler) {
if (!signaling_thread_->IsCurrent()) {
signaling_thread_->PostTask(RTC_FROM_HERE, [=] {
SetSdpOfferAndGetAnswer(remote_offer, answer_handler);
});
return;
}
RTC_DCHECK_RUN_ON(signaling_thread_);
peer_connection_->SetRemoteDescription(
CreateSessionDescription(SdpType::kOffer, remote_offer),
SdpSetObserver([=]() {
RTC_DCHECK_RUN_ON(signaling_thread_);
peer_connection_->CreateAnswer(
SdpCreateObserver([=](SessionDescriptionInterface* answer) {
RTC_DCHECK_RUN_ON(signaling_thread_);
std::string sdp_answer;
answer->ToString(&sdp_answer);
RTC_LOG(LS_INFO) << sdp_answer;
@ -275,6 +287,12 @@ void PeerScenarioClient::SetSdpOfferAndGetAnswer(
void PeerScenarioClient::SetSdpAnswer(
std::string remote_answer,
std::function<void(const SessionDescriptionInterface&)> done_handler) {
if (!signaling_thread_->IsCurrent()) {
signaling_thread_->PostTask(
RTC_FROM_HERE, [=] { SetSdpAnswer(remote_answer, done_handler); });
return;
}
RTC_DCHECK_RUN_ON(signaling_thread_);
peer_connection_->SetRemoteDescription(
CreateSessionDescription(SdpType::kAnswer, remote_answer),
SdpSetObserver([remote_answer, done_handler] {
@ -285,12 +303,12 @@ void PeerScenarioClient::SetSdpAnswer(
void PeerScenarioClient::AddIceCandidate(
std::unique_ptr<IceCandidateInterface> candidate) {
RTC_DCHECK_RUN_ON(signaling_thread_);
if (peer_connection_->signaling_state() ==
PeerConnectionInterface::SignalingState::kStable &&
peer_connection_->current_remote_description()) {
RTC_CHECK(peer_connection_->AddIceCandidate(candidate.get()));
} else {
RTC_DCHECK_RUN_ON(signaling_thread_);
pending_ice_candidates_.push_back(std::move(candidate));
}
}

View File

@ -107,7 +107,10 @@ class PeerScenarioClient {
Config config);
PeerConnectionFactoryInterface* factory() { return pc_factory_.get(); }
PeerConnectionInterface* pc() { return peer_connection_.get(); }
PeerConnectionInterface* pc() {
RTC_DCHECK_RUN_ON(signaling_thread_);
return peer_connection_.get();
}
rtc::Thread* thread() { return signaling_thread_; }
Clock* clock() { return Clock::GetRealTimeClock(); }
@ -150,7 +153,8 @@ class PeerScenarioClient {
RTC_GUARDED_BY(signaling_thread_);
rtc::scoped_refptr<PeerConnectionFactoryInterface> pc_factory_;
rtc::scoped_refptr<PeerConnectionInterface> peer_connection_;
rtc::scoped_refptr<PeerConnectionInterface> peer_connection_
RTC_GUARDED_BY(signaling_thread_);
};
} // namespace test