diff options
Diffstat (limited to 'base')
-rw-r--r-- | base/base.gypi | 2 | ||||
-rw-r--r-- | base/debug/profiler.cc | 65 | ||||
-rw-r--r-- | base/debug/profiler.h | 35 |
3 files changed, 102 insertions, 0 deletions
diff --git a/base/base.gypi b/base/base.gypi index aee11f5..385794e 100644 --- a/base/base.gypi +++ b/base/base.gypi @@ -52,6 +52,8 @@ 'debug/debugger_win.cc', 'debug/leak_annotations.h', 'debug/leak_tracker.h', + 'debug/profiler.cc', + 'debug/profiler.h', 'debug/stack_trace.cc', 'debug/stack_trace.h', 'debug/stack_trace_posix.cc', diff --git a/base/debug/profiler.cc b/base/debug/profiler.cc new file mode 100644 index 0000000..8597dac --- /dev/null +++ b/base/debug/profiler.cc @@ -0,0 +1,65 @@ +// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/debug/profiler.h" + +#include <string> + +#include "base/process_util.h" +#include "base/string_util.h" + +#if defined(ENABLE_PROFILING) && !defined(NO_TCMALLOC) +#include "third_party/tcmalloc/chromium/src/google/profiler.h" +#endif + +namespace base { +namespace debug { + +#if defined(ENABLE_PROFILING) && !defined(NO_TCMALLOC) + +static int profile_count = 0; + +void StartProfiling(const std::string& name) { + ++profile_count; + std::string full_name(name); + std::string pid = StringPrintf("%d", GetCurrentProcId()); + std::string count = StringPrintf("%d", profile_count); + ReplaceSubstringsAfterOffset(&full_name, 0, "{pid}", pid); + ReplaceSubstringsAfterOffset(&full_name, 0, "{count}", count); + ProfilerStart(full_name.c_str()); +} + +void StopProfiling() { + ProfilerFlush(); + ProfilerStop(); +} + +void FlushProfiling() { + ProfilerFlush(); +} + +bool BeingProfiled() { + return ProfilingIsEnabledForAllThreads(); +} + +#else + +void StartProfiling(const std::string& name) { +} + +void StopProfiling() { +} + +void FlushProfiling() { +} + +bool BeingProfiled() { + return false; +} + +#endif + +} // namespace debug +} // namespace base + diff --git a/base/debug/profiler.h b/base/debug/profiler.h new file mode 100644 index 0000000..e3044d6 --- /dev/null +++ b/base/debug/profiler.h @@ -0,0 +1,35 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_DEBUG_PROFILER_H +#define BASE_DEBUG_PROFILER_H +#pragma once + +#include <string> + +// The Profiler functions allow usage of the underlying sampling based +// profiler. If the application has not been built with the necessary +// flags (-DENABLE_PROFILING and not -DNO_TCMALLOC) then these functions +// are noops. +namespace base { +namespace debug { + +// Start profiling with the supplied name. +// {pid} will be replaced by the process' pid and {count} will be replaced +// by the count of the profile run (starts at 1 with each process). +void StartProfiling(const std::string& name); + +// Stop profiling and write out data. +void StopProfiling(); + +// Force data to be written to file. +void FlushProfiling(); + +// Returns true if process is being profiled. +bool BeingProfiled(); + +} // namespace debug +} // namespace base + +#endif // BASE_DEBUG_DEBUGGER_H |