Revision: 8152 Author: [email protected] Date: Wed Jun 1 15:12:05 2011 Log: [Linux] Do not install SIGPROF handler until we start CPU profiling.
[email protected] BUG=1344,crbug/79320,crbug/83521 TEST=none Review URL: http://codereview.chromium.org/7107003 http://code.google.com/p/v8/source/detail?r=8152 Modified: /branches/bleeding_edge/src/platform-linux.cc ======================================= --- /branches/bleeding_edge/src/platform-linux.cc Fri May 6 05:52:12 2011 +++ /branches/bleeding_edge/src/platform-linux.cc Wed Jun 1 15:12:05 2011 @@ -979,19 +979,28 @@ vm_tgid_(getpid()), interval_(interval) {} + static void InstallSignalHandler() { + struct sigaction sa; + sa.sa_sigaction = ProfilerSignalHandler; + sigemptyset(&sa.sa_mask); + sa.sa_flags = SA_RESTART | SA_SIGINFO; + signal_handler_installed_ = + (sigaction(SIGPROF, &sa, &old_signal_handler_) == 0); + } + + static void RestoreSignalHandler() { + if (signal_handler_installed_) { + sigaction(SIGPROF, &old_signal_handler_, 0); + signal_handler_installed_ = false; + } + } + static void AddActiveSampler(Sampler* sampler) { ScopedLock lock(mutex_); SamplerRegistry::AddActiveSampler(sampler); if (instance_ == NULL) { - // Install a signal handler. - struct sigaction sa; - sa.sa_sigaction = ProfilerSignalHandler; - sigemptyset(&sa.sa_mask); - sa.sa_flags = SA_RESTART | SA_SIGINFO; - signal_handler_installed_ = - (sigaction(SIGPROF, &sa, &old_signal_handler_) == 0); - - // Start a thread that sends SIGPROF signal to VM threads. + // Start a thread that will send SIGPROF signal to VM threads, + // when CPU profiling will be enabled. instance_ = new SignalSender(sampler->interval()); instance_->Start(); } else { @@ -1007,12 +1016,7 @@ instance_->Join(); delete instance_; instance_ = NULL; - - // Restore the old signal handler. - if (signal_handler_installed_) { - sigaction(SIGPROF, &old_signal_handler_, 0); - signal_handler_installed_ = false; - } + RestoreSignalHandler(); } } @@ -1024,6 +1028,10 @@ bool cpu_profiling_enabled = (state == SamplerRegistry::HAS_CPU_PROFILING_SAMPLERS); bool runtime_profiler_enabled = RuntimeProfiler::IsEnabled(); + if (cpu_profiling_enabled && !signal_handler_installed_) + InstallSignalHandler(); + else if (!cpu_profiling_enabled && signal_handler_installed_) + RestoreSignalHandler(); // When CPU profiling is enabled both JavaScript and C++ code is // profiled. We must not suspend. if (!cpu_profiling_enabled) { -- v8-dev mailing list [email protected] http://groups.google.com/group/v8-dev
