Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(24)

Unified Diff: webrtc/pc/channel_unittest.cc

Issue 1736763006: Fix for intermittent tsan2 errors from SendRtpToRtpOnThread and SendSrtpToSrtpOnThread. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Moved two stars. Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « webrtc/build/sanitizers/tsan_suppressions_webrtc.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webrtc/pc/channel_unittest.cc
diff --git a/webrtc/pc/channel_unittest.cc b/webrtc/pc/channel_unittest.cc
index ad5fbaf1847e11997359b66b6846f8f4706ce43c..965ca27972f905d6c8513f2c493bae5d0b476856 100644
--- a/webrtc/pc/channel_unittest.cc
+++ b/webrtc/pc/channel_unittest.cc
@@ -9,6 +9,7 @@
*/
#include "webrtc/base/arraysize.h"
+#include "webrtc/base/criticalsection.h"
#include "webrtc/base/fileutils.h"
#include "webrtc/base/gunit.h"
#include "webrtc/base/helpers.h"
@@ -408,28 +409,64 @@ class ChannelTest : public testing::Test, public sigslot::has_slots<> {
class CallThread : public rtc::SignalThread {
public:
typedef bool (ChannelTest<T>::*Method)();
- CallThread(ChannelTest<T>* obj, Method method, bool* result)
+ CallThread(ChannelTest<T>* obj, Method method, bool* result = nullptr)
: obj_(obj),
method_(method),
- result_(result) {
- *result = false;
+ result_(false),
+ result_ptr_(result) {
+ if (result_ptr_)
+ *result_ptr_ = false;
}
- virtual void DoWork() {
- bool result = (*obj_.*method_)();
- if (result_) {
- *result_ = result;
+
+ ~CallThread() {
+ if (result_ptr_) {
+ rtc::CritScope cs(&result_lock_);
+ *result_ptr_ = result_;
}
}
+
+ virtual void DoWork() {
+ SetResult((*obj_.*method_)());
+ }
+
+ bool result() {
+ rtc::CritScope cs(&result_lock_);
+ return result_;
+ }
+
private:
+ void SetResult(const bool& result) {
+ rtc::CritScope cs(&result_lock_);
+ result_ = result;
+ }
+
ChannelTest<T>* obj_;
Method method_;
- bool* result_;
+ rtc::CriticalSection result_lock_;
+ bool result_ GUARDED_BY(result_lock_);
+ bool* result_ptr_;
+ };
+
+ // Will manage the lifetime of a CallThread, making sure it's
+ // destroyed before this object goes out of scope.
+ class ScopedCallThread {
+ public:
+ using Method = typename CallThread::Method;
+
+ ScopedCallThread(ChannelTest<T>* obj, Method method)
+ : thread_(new CallThread(obj, method)) {
+ thread_->Start();
+ }
+
+ ~ScopedCallThread() {
+ thread_->Destroy(true);
+ }
+
+ bool result() const { return thread_->result(); }
+
+ private:
+ CallThread* thread_;
};
- void CallOnThread(typename CallThread::Method method, bool* result) {
- CallThread* thread = new CallThread(this, method, result);
- thread->Start();
- thread->Release();
- }
void CallOnThreadAndWaitForDone(typename CallThread::Method method,
bool* result) {
@@ -1326,48 +1363,46 @@ class ChannelTest : public testing::Test, public sigslot::has_slots<> {
// Test that we properly send RTP without SRTP from a thread.
void SendRtpToRtpOnThread() {
- bool sent_rtp1, sent_rtp2, sent_rtcp1, sent_rtcp2;
CreateChannels(RTCP, RTCP);
EXPECT_TRUE(SendInitiate());
EXPECT_TRUE(SendAccept());
- CallOnThread(&ChannelTest<T>::SendRtp1, &sent_rtp1);
- CallOnThread(&ChannelTest<T>::SendRtp2, &sent_rtp2);
- CallOnThread(&ChannelTest<T>::SendRtcp1, &sent_rtcp1);
- CallOnThread(&ChannelTest<T>::SendRtcp2, &sent_rtcp2);
+ ScopedCallThread send_rtp1(this, &ChannelTest<T>::SendRtp1);
+ ScopedCallThread send_rtp2(this, &ChannelTest<T>::SendRtp2);
+ ScopedCallThread send_rtcp1(this, &ChannelTest<T>::SendRtcp1);
+ ScopedCallThread send_rtcp2(this, &ChannelTest<T>::SendRtcp2);
EXPECT_TRUE_WAIT(CheckRtp1(), 1000);
EXPECT_TRUE_WAIT(CheckRtp2(), 1000);
- EXPECT_TRUE_WAIT(sent_rtp1, 1000);
- EXPECT_TRUE_WAIT(sent_rtp2, 1000);
+ EXPECT_TRUE_WAIT(send_rtp1.result(), 1000);
+ EXPECT_TRUE_WAIT(send_rtp2.result(), 1000);
EXPECT_TRUE(CheckNoRtp1());
EXPECT_TRUE(CheckNoRtp2());
EXPECT_TRUE_WAIT(CheckRtcp1(), 1000);
EXPECT_TRUE_WAIT(CheckRtcp2(), 1000);
- EXPECT_TRUE_WAIT(sent_rtcp1, 1000);
- EXPECT_TRUE_WAIT(sent_rtcp2, 1000);
+ EXPECT_TRUE_WAIT(send_rtcp1.result(), 1000);
+ EXPECT_TRUE_WAIT(send_rtcp2.result(), 1000);
EXPECT_TRUE(CheckNoRtcp1());
EXPECT_TRUE(CheckNoRtcp2());
}
// Test that we properly send SRTP with RTCP from a thread.
void SendSrtpToSrtpOnThread() {
- bool sent_rtp1, sent_rtp2, sent_rtcp1, sent_rtcp2;
CreateChannels(RTCP | SECURE, RTCP | SECURE);
EXPECT_TRUE(SendInitiate());
EXPECT_TRUE(SendAccept());
- CallOnThread(&ChannelTest<T>::SendRtp1, &sent_rtp1);
- CallOnThread(&ChannelTest<T>::SendRtp2, &sent_rtp2);
- CallOnThread(&ChannelTest<T>::SendRtcp1, &sent_rtcp1);
- CallOnThread(&ChannelTest<T>::SendRtcp2, &sent_rtcp2);
+ ScopedCallThread send_rtp1(this, &ChannelTest<T>::SendRtp1);
+ ScopedCallThread send_rtp2(this, &ChannelTest<T>::SendRtp2);
+ ScopedCallThread send_rtcp1(this, &ChannelTest<T>::SendRtcp1);
+ ScopedCallThread send_rtcp2(this, &ChannelTest<T>::SendRtcp2);
EXPECT_TRUE_WAIT(CheckRtp1(), 1000);
EXPECT_TRUE_WAIT(CheckRtp2(), 1000);
- EXPECT_TRUE_WAIT(sent_rtp1, 1000);
- EXPECT_TRUE_WAIT(sent_rtp2, 1000);
+ EXPECT_TRUE_WAIT(send_rtp1.result(), 1000);
+ EXPECT_TRUE_WAIT(send_rtp2.result(), 1000);
EXPECT_TRUE(CheckNoRtp1());
EXPECT_TRUE(CheckNoRtp2());
EXPECT_TRUE_WAIT(CheckRtcp1(), 1000);
EXPECT_TRUE_WAIT(CheckRtcp2(), 1000);
- EXPECT_TRUE_WAIT(sent_rtcp1, 1000);
- EXPECT_TRUE_WAIT(sent_rtcp2, 1000);
+ EXPECT_TRUE_WAIT(send_rtcp1.result(), 1000);
+ EXPECT_TRUE_WAIT(send_rtcp2.result(), 1000);
EXPECT_TRUE(CheckNoRtcp1());
EXPECT_TRUE(CheckNoRtcp2());
}
@@ -1625,7 +1660,6 @@ class ChannelTest : public testing::Test, public sigslot::has_slots<> {
void TestFlushRtcp() {
bool send_rtcp1;
-
CreateChannels(RTCP, RTCP);
EXPECT_TRUE(SendInitiate());
EXPECT_TRUE(SendAccept());
« no previous file with comments | « webrtc/build/sanitizers/tsan_suppressions_webrtc.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698