From 50b0baf510dae855f433a553c78b1577c28af5f0 Mon Sep 17 00:00:00 2001 From: Yves Gerey Date: Fri, 6 Sep 2019 10:03:54 +0200 Subject: [PATCH] [tsan] Guard TestStatictics against concurrent access. This CL quiets ThreadSanitizer for EventTracerTest.ScopedTraceEvent unit test. Bug: webrtc:10943 Change-Id: Ifaec1ab37b85f091872f55e630189387f8df4401 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/151309 Reviewed-by: Karl Wiberg Commit-Queue: Yves Gerey Cr-Commit-Position: refs/heads/master@{#29090} --- rtc_base/event_tracer_unittest.cc | 51 ++++++++++++++++++------------- 1 file changed, 30 insertions(+), 21 deletions(-) diff --git a/rtc_base/event_tracer_unittest.cc b/rtc_base/event_tracer_unittest.cc index 27248e7547..2556d24fe5 100644 --- a/rtc_base/event_tracer_unittest.cc +++ b/rtc_base/event_tracer_unittest.cc @@ -10,6 +10,8 @@ #include "rtc_base/event_tracer.h" +#include "rtc_base/critical_section.h" +#include "rtc_base/thread_annotations.h" #include "rtc_base/trace_event.h" #include "test/gtest.h" @@ -17,38 +19,45 @@ namespace { class TestStatistics { public: - TestStatistics() : events_logged_(0) {} + void Reset() { + rtc::CritScope cs(&crit_); + events_logged_ = 0; + } - void Reset() { events_logged_ = 0; } + void Increment() { + rtc::CritScope cs(&crit_); + ++events_logged_; + } - void Increment() { ++events_logged_; } - - int Count() const { return events_logged_; } + int Count() const { + rtc::CritScope cs(&crit_); + return events_logged_; + } static TestStatistics* Get() { - static TestStatistics* test_stats = nullptr; - if (!test_stats) - test_stats = new TestStatistics(); - return test_stats; + // google.github.io/styleguide/cppguide.html#Static_and_Global_Variables + static auto& test_stats = *new TestStatistics(); + return &test_stats; } private: - int events_logged_; + rtc::CriticalSection crit_; + int events_logged_ RTC_GUARDED_BY(crit_) = 0; }; -static const unsigned char* GetCategoryEnabledHandler(const char* name) { +const unsigned char* GetCategoryEnabledHandler(const char* /*name*/) { return reinterpret_cast("test"); } -static void AddTraceEventHandler(char phase, - const unsigned char* category_enabled, - const char* name, - unsigned long long id, - int num_args, - const char** arg_names, - const unsigned char* arg_types, - const unsigned long long* arg_values, - unsigned char flags) { +void TraceEventHandler(char /*phase*/, + const unsigned char* /*category_enabled*/, + const char* /*name*/, + unsigned long long /*id*/, + int /*num_args*/, + const char** /*arg_names*/, + const unsigned char* /*arg_types*/, + const unsigned long long* /*arg_values*/, + unsigned char /*flags*/) { TestStatistics::Get()->Increment(); } @@ -63,7 +72,7 @@ TEST(EventTracerTest, EventTracerDisabled) { } TEST(EventTracerTest, ScopedTraceEvent) { - SetupEventTracer(&GetCategoryEnabledHandler, &AddTraceEventHandler); + SetupEventTracer(&GetCategoryEnabledHandler, &TraceEventHandler); { TRACE_EVENT0("test", "ScopedTraceEvent"); } EXPECT_EQ(2, TestStatistics::Get()->Count()); TestStatistics::Get()->Reset();