diff options
author | primiano <primiano@chromium.org> | 2015-02-20 06:31:12 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-02-20 14:31:54 +0000 |
commit | 97206c26057c11573bf6aea8aff40ee345874648 (patch) | |
tree | 1fa3686e6ac450cb3e1551c061215f6f75d17239 /base/trace_event | |
parent | 6b24b2094c9e3bc35e2c30b368f292e078d4a00b (diff) | |
download | chromium_src-97206c26057c11573bf6aea8aff40ee345874648.zip chromium_src-97206c26057c11573bf6aea8aff40ee345874648.tar.gz chromium_src-97206c26057c11573bf6aea8aff40ee345874648.tar.bz2 |
[tracing] Fix MemoryDumpManager testing instance teardown pattern.
crrev.com/933613002 introduced a ODR violtaion by adding the
DeleteForTesting method (other definition in trace_event_impl.cc).
This was causing an ASan assertion (see crbug.com/459556) and failures
of base_unittests in debug builds (see crrev.com/933613002 #33).
This CL fixes the DeleteForTesting pattern removing the awkward ODR
violation.
BUG=459556,458295
TBR=nduca@chromium.org
Review URL: https://codereview.chromium.org/942803002
Cr-Commit-Position: refs/heads/master@{#317316}
Diffstat (limited to 'base/trace_event')
-rw-r--r-- | base/trace_event/memory_dump_manager.cc | 23 | ||||
-rw-r--r-- | base/trace_event/memory_dump_manager.h | 6 | ||||
-rw-r--r-- | base/trace_event/memory_dump_manager_unittest.cc | 10 |
3 files changed, 18 insertions, 21 deletions
diff --git a/base/trace_event/memory_dump_manager.cc b/base/trace_event/memory_dump_manager.cc index bf631b3..c1a9685 100644 --- a/base/trace_event/memory_dump_manager.cc +++ b/base/trace_event/memory_dump_manager.cc @@ -10,21 +10,13 @@ #include "base/trace_event/memory_dump_provider.h" #include "base/trace_event/process_memory_dump.h" -// TODO(primiano): in a separate CL rename DeleteTraceLogForTesting into -// something like base::internal::TeardownSingletonForTesting so we don't have -// to add a new friend to singleton each time. -class DeleteTraceLogForTesting { - public: - static void Delete() { - Singleton< - base::trace_event::MemoryDumpManager, - LeakySingletonTraits<base::trace_event::MemoryDumpManager>>::OnExit(0); - } -}; - namespace base { namespace trace_event { +namespace { +MemoryDumpManager* g_instance_for_testing = nullptr; +} + // TODO(primiano): this should be smarter and should do something similar to // trace event synthetic delays. const char MemoryDumpManager::kTraceCategory[] = @@ -32,13 +24,16 @@ const char MemoryDumpManager::kTraceCategory[] = // static MemoryDumpManager* MemoryDumpManager::GetInstance() { + if (g_instance_for_testing) + return g_instance_for_testing; + return Singleton<MemoryDumpManager, LeakySingletonTraits<MemoryDumpManager>>::get(); } // static -void MemoryDumpManager::DeleteForTesting() { - DeleteTraceLogForTesting::Delete(); +void MemoryDumpManager::SetInstanceForTesting(MemoryDumpManager* instance) { + g_instance_for_testing = instance; } MemoryDumpManager::MemoryDumpManager() : memory_tracing_enabled_(0) { diff --git a/base/trace_event/memory_dump_manager.h b/base/trace_event/memory_dump_manager.h index fbc71d5..1a22e61 100644 --- a/base/trace_event/memory_dump_manager.h +++ b/base/trace_event/memory_dump_manager.h @@ -50,17 +50,17 @@ class BASE_EXPORT MemoryDumpManager : public TraceLog::EnabledStateObserver { void OnTraceLogDisabled() override; private: + friend struct DefaultDeleter<MemoryDumpManager>; // For the testing instance. friend struct DefaultSingletonTraits<MemoryDumpManager>; friend class MemoryDumpManagerTest; static const char kTraceCategory[]; + static void SetInstanceForTesting(MemoryDumpManager* instance); + MemoryDumpManager(); virtual ~MemoryDumpManager(); - // Tears down the singleton instance. - static void DeleteForTesting(); - // Broadcasts the dump requests to the other processes. void BroadcastDumpRequest(); diff --git a/base/trace_event/memory_dump_manager_unittest.cc b/base/trace_event/memory_dump_manager_unittest.cc index b5337e9..1ba73e6 100644 --- a/base/trace_event/memory_dump_manager_unittest.cc +++ b/base/trace_event/memory_dump_manager_unittest.cc @@ -17,14 +17,16 @@ namespace trace_event { class MemoryDumpManagerTest : public testing::Test { public: void SetUp() override { + mdm_.reset(new MemoryDumpManager()); + MemoryDumpManager::SetInstanceForTesting(mdm_.get()); + ASSERT_EQ(mdm_, MemoryDumpManager::GetInstance()); MemoryDumpManager::GetInstance()->Initialize(); - mdm_ = MemoryDumpManager::GetInstance(); } void TearDown() override { - MemoryDumpManager::DeleteForTesting(); + MemoryDumpManager::SetInstanceForTesting(nullptr); + mdm_.reset(); TraceLog::DeleteForTesting(); - mdm_ = NULL; } protected: @@ -37,7 +39,7 @@ class MemoryDumpManagerTest : public testing::Test { void DisableTracing() { TraceLog::GetInstance()->SetDisabled(); } - MemoryDumpManager* mdm_; + scoped_ptr<MemoryDumpManager> mdm_; private: // We want our singleton torn down after each test. |