| Index: chrome/common/stack_sampling_configuration.cc
|
| diff --git a/chrome/common/stack_sampling_configuration.cc b/chrome/common/stack_sampling_configuration.cc
|
| index 437773048cab8688423dc0e25a7d2bfb99319242..3ca8ae50a620f9c1c5c4ebd23f9a29151ee40a18 100644
|
| --- a/chrome/common/stack_sampling_configuration.cc
|
| +++ b/chrome/common/stack_sampling_configuration.cc
|
| @@ -4,12 +4,19 @@
|
|
|
| #include "chrome/common/stack_sampling_configuration.h"
|
|
|
| +#include "base/command_line.h"
|
| +#include "base/lazy_instance.h"
|
| #include "base/rand_util.h"
|
| #include "chrome/common/channel_info.h"
|
| +#include "chrome/common/chrome_switches.h"
|
| #include "components/version_info/version_info.h"
|
| +#include "content/public/common/content_switches.h"
|
|
|
| namespace {
|
|
|
| +base::LazyInstance<StackSamplingConfiguration>::Leaky g_configuration =
|
| + LAZY_INSTANCE_INITIALIZER;
|
| +
|
| // The profiler is currently only implemented for Windows x64, and only runs on
|
| // trunk, canary, and dev.
|
| bool IsProfilerSupported() {
|
| @@ -23,6 +30,15 @@ bool IsProfilerSupported() {
|
| #endif
|
| }
|
|
|
| +// Returns true if the current execution is taking place in the browser process.
|
| +bool IsBrowserProcess() {
|
| + const base::CommandLine* command_line =
|
| + base::CommandLine::ForCurrentProcess();
|
| + std::string process_type =
|
| + command_line->GetSwitchValueASCII(switches::kProcessType);
|
| + return process_type.empty();
|
| +}
|
| +
|
| } // namespace
|
|
|
| StackSamplingConfiguration::StackSamplingConfiguration()
|
| @@ -30,54 +46,41 @@ StackSamplingConfiguration::StackSamplingConfiguration()
|
| }
|
|
|
| base::StackSamplingProfiler::SamplingParams
|
| -StackSamplingConfiguration::GetSamplingParams() const {
|
| +StackSamplingConfiguration::GetSamplingParamsForCurrentProcess() const {
|
| base::StackSamplingProfiler::SamplingParams params;
|
| params.bursts = 1;
|
| - const base::TimeDelta duration = base::TimeDelta::FromSeconds(30);
|
| -
|
| - switch (configuration_) {
|
| - case PROFILE_DISABLED:
|
| - case PROFILE_CONTROL:
|
| - params.initial_delay = base::TimeDelta::FromMilliseconds(0);
|
| - params.sampling_interval = base::TimeDelta::FromMilliseconds(0);
|
| - params.samples_per_burst = 0;
|
| - break;
|
| -
|
| - case PROFILE_NO_SAMPLES:
|
| - params.initial_delay = duration;
|
| - params.sampling_interval = base::TimeDelta::FromMilliseconds(0);
|
| - params.samples_per_burst = 0;
|
| - break;
|
| -
|
| - case PROFILE_5HZ:
|
| - params.initial_delay = base::TimeDelta::FromMilliseconds(0);
|
| - params.sampling_interval = base::TimeDelta::FromMilliseconds(200);
|
| - params.samples_per_burst = duration / params.sampling_interval;
|
| - break;
|
| -
|
| - case PROFILE_10HZ:
|
| - params.initial_delay = base::TimeDelta::FromMilliseconds(0);
|
| - params.sampling_interval = base::TimeDelta::FromMilliseconds(100);
|
| - params.samples_per_burst = duration / params.sampling_interval;
|
| - break;
|
| -
|
| - case PROFILE_100HZ:
|
| - params.initial_delay = base::TimeDelta::FromMilliseconds(0);
|
| - params.sampling_interval = base::TimeDelta::FromMilliseconds(10);
|
| - params.samples_per_burst = duration / params.sampling_interval;
|
| - break;
|
| + params.initial_delay = base::TimeDelta::FromMilliseconds(0);
|
| + params.sampling_interval = base::TimeDelta::FromMilliseconds(0);
|
| + params.samples_per_burst = 0;
|
| +
|
| + if (IsProfilerEnabledForCurrentProcess()) {
|
| + const base::TimeDelta duration = base::TimeDelta::FromSeconds(30);
|
| + params.sampling_interval = base::TimeDelta::FromMilliseconds(100);
|
| + params.samples_per_burst = duration / params.sampling_interval;
|
| }
|
| +
|
| return params;
|
| }
|
|
|
| -bool StackSamplingConfiguration::IsProfilerEnabled() const {
|
| - return (configuration_ != PROFILE_DISABLED &&
|
| - configuration_ != PROFILE_CONTROL);
|
| +bool StackSamplingConfiguration::IsProfilerEnabledForCurrentProcess() const {
|
| + if (IsBrowserProcess()) {
|
| + return configuration_ == PROFILE_BROWSER_PROCESS ||
|
| + configuration_ == PROFILE_BROWSER_AND_GPU_PROCESS;
|
| + }
|
| +
|
| + DCHECK_EQ(PROFILE_FROM_COMMAND_LINE, configuration_);
|
| + // This is a child process. The |kStartStackProfiler| switch passed by the
|
| + // browser process determines whether the profiler is enabled for the process.
|
| + const base::CommandLine* command_line =
|
| + base::CommandLine::ForCurrentProcess();
|
| + return command_line->HasSwitch(switches::kStartStackProfiler);
|
| }
|
|
|
| bool StackSamplingConfiguration::GetSyntheticFieldTrial(
|
| std::string* trial_name,
|
| std::string* group_name) const {
|
| + DCHECK(IsBrowserProcess());
|
| +
|
| if (!IsProfilerSupported())
|
| return false;
|
|
|
| @@ -92,36 +95,56 @@ bool StackSamplingConfiguration::GetSyntheticFieldTrial(
|
| *group_name = "Control";
|
| break;
|
|
|
| - case PROFILE_NO_SAMPLES:
|
| - *group_name = "NoSamples";
|
| + case PROFILE_BROWSER_PROCESS:
|
| + *group_name = "BrowserProcess";
|
| break;
|
|
|
| - case PROFILE_5HZ:
|
| - *group_name = "5Hz";
|
| + case PROFILE_GPU_PROCESS:
|
| + *group_name = "GpuProcess";
|
| break;
|
|
|
| - case PROFILE_10HZ:
|
| - *group_name = "10Hz";
|
| + case PROFILE_BROWSER_AND_GPU_PROCESS:
|
| + *group_name = "BrowserAndGpuProcess";
|
| break;
|
|
|
| - case PROFILE_100HZ:
|
| - *group_name = "100Hz";
|
| + case PROFILE_FROM_COMMAND_LINE:
|
| + NOTREACHED();
|
| break;
|
| }
|
|
|
| return !group_name->empty();
|
| }
|
|
|
| +void StackSamplingConfiguration::AppendCommandLineSwitchForChildProcess(
|
| + const std::string& process_type,
|
| + base::CommandLine* command_line) const {
|
| + DCHECK(IsBrowserProcess());
|
| +
|
| + if (process_type == switches::kGpuProcess &&
|
| + (configuration_ == PROFILE_GPU_PROCESS ||
|
| + configuration_ == PROFILE_BROWSER_AND_GPU_PROCESS)) {
|
| + command_line->AppendSwitch(switches::kStartStackProfiler);
|
| + }
|
| +}
|
| +
|
| +// static
|
| +StackSamplingConfiguration* StackSamplingConfiguration::Get() {
|
| + return g_configuration.Pointer();
|
| +}
|
| +
|
| // static
|
| StackSamplingConfiguration::ProfileConfiguration
|
| StackSamplingConfiguration::GenerateConfiguration() {
|
| + if (!IsBrowserProcess())
|
| + return PROFILE_FROM_COMMAND_LINE;
|
| +
|
| if (!IsProfilerSupported())
|
| return PROFILE_DISABLED;
|
|
|
| - // Enable the profiler in the intended ultimate production configuration for
|
| + // Enable the profiler in the ultimate production configuration for
|
| // development/waterfall builds.
|
| if (chrome::GetChannel() == version_info::Channel::UNKNOWN)
|
| - return PROFILE_10HZ;
|
| + return PROFILE_BROWSER_AND_GPU_PROCESS;
|
|
|
| // Enable according to the variations below in canary and dev.
|
| if (chrome::GetChannel() == version_info::Channel::CANARY ||
|
| @@ -133,7 +156,9 @@ StackSamplingConfiguration::GenerateConfiguration() {
|
|
|
| // Generate a configuration according to the associated weights.
|
| const Variation variations[] = {
|
| - { PROFILE_10HZ, 100},
|
| + { PROFILE_BROWSER_PROCESS, 100},
|
| + { PROFILE_GPU_PROCESS, 0},
|
| + { PROFILE_BROWSER_AND_GPU_PROCESS, 0},
|
| { PROFILE_CONTROL, 0},
|
| { PROFILE_DISABLED, 0}
|
| };
|
|
|