From 267041c47086fc0da9ce3247a496964c924bb2d9 Mon Sep 17 00:00:00 2001 From: ilnik Date: Tue, 27 Jun 2017 07:21:01 -0700 Subject: [PATCH] Fix deadlock in webrtc_perf_tests Reenable hanging tests on Mac. Deadlock happened because the following locks were grabbed by two threads at the end of a test: Thread 1: CapturedFrameForwarder::AddOrUpdateSink() locks CapturedFrameForwarder::crit_ and calls FrameGeneratorCapturer::AddOrUpdateSink() what tries to lock FrameGeneratorCapturer::lock_. Thread 2: FrameGeneratorCapturer::InsertFrame() locks FrameGeneratorCapturer::lock_ and calls CapturedFrameForwarder::OnFrame() which tries to lock CapturedFrameForwarder::crit_. So two threads are locking two same locks in different orders which may cause deadlock. BUG=webrtc:7870 Review-Url: https://codereview.webrtc.org/2955083002 Cr-Commit-Position: refs/heads/master@{#18783} --- webrtc/video/full_stack_tests.cc | 3 +-- webrtc/video/video_quality_test.cc | 8 +++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/webrtc/video/full_stack_tests.cc b/webrtc/video/full_stack_tests.cc index 3e5781688e..8299771379 100644 --- a/webrtc/video/full_stack_tests.cc +++ b/webrtc/video/full_stack_tests.cc @@ -465,8 +465,7 @@ TEST_F(FullStackTest, VP9SVC_3SL_Low) { #endif // !defined(RTC_DISABLE_VP9) // Android bots can't handle FullHD, so disable the test. -// Test is not working correctly on Mac: webrtc:7870. -#if defined(WEBRTC_ANDROID) || defined(WEBRTC_MAC) +#if defined(WEBRTC_ANDROID) #define MAYBE_SimulcastFullHdOveruse DISABLED_SimulcastFullHdOveruse #else #define MAYBE_SimulcastFullHdOveruse SimulcastFullHdOveruse diff --git a/webrtc/video/video_quality_test.cc b/webrtc/video/video_quality_test.cc index 4357276146..37b47867d3 100644 --- a/webrtc/video/video_quality_test.cc +++ b/webrtc/video/video_quality_test.cc @@ -939,9 +939,11 @@ class VideoAnalyzer : public PacketReceiver, // Called when |send_stream_.SetSource()| is called. void AddOrUpdateSink(rtc::VideoSinkInterface* sink, const rtc::VideoSinkWants& wants) override { - rtc::CritScope lock(&crit_); - RTC_DCHECK(!send_stream_input_ || send_stream_input_ == sink); - send_stream_input_ = sink; + { + rtc::CritScope lock(&crit_); + RTC_DCHECK(!send_stream_input_ || send_stream_input_ == sink); + send_stream_input_ = sink; + } if (video_capturer_) { video_capturer_->AddOrUpdateSink(this, wants); }