summaryrefslogtreecommitdiffstats
path: root/base/trace_event
diff options
context:
space:
mode:
authorprimiano <primiano@chromium.org>2015-02-20 06:31:12 -0800
committerCommit bot <commit-bot@chromium.org>2015-02-20 14:31:54 +0000
commit97206c26057c11573bf6aea8aff40ee345874648 (patch)
tree1fa3686e6ac450cb3e1551c061215f6f75d17239 /base/trace_event
parent6b24b2094c9e3bc35e2c30b368f292e078d4a00b (diff)
downloadchromium_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.cc23
-rw-r--r--base/trace_event/memory_dump_manager.h6
-rw-r--r--base/trace_event/memory_dump_manager_unittest.cc10
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.