Index: src/platform-solaris.cc |
=================================================================== |
--- src/platform-solaris.cc (revision 8500) |
+++ src/platform-solaris.cc (working copy) |
@@ -595,17 +595,6 @@ |
return pthread_self(); |
} |
-class Sampler::PlatformData : public Malloced { |
- public: |
- PlatformData() : vm_tid_(GetThreadID()) {} |
- |
- pthread_t vm_tid() const { return vm_tid_; } |
- |
- private: |
- pthread_t vm_tid_; |
-}; |
- |
- |
static void ProfilerSignalHandler(int signal, siginfo_t* info, void* context) { |
USE(info); |
if (signal != SIGPROF) return; |
@@ -639,6 +628,17 @@ |
sampler->Tick(sample); |
} |
+class Sampler::PlatformData : public Malloced { |
+ public: |
+ PlatformData() : vm_tid_(GetThreadID()) {} |
+ |
+ pthread_t vm_tid() const { return vm_tid_; } |
+ |
+ private: |
+ pthread_t vm_tid_; |
+}; |
+ |
+ |
class SignalSender : public Thread { |
public: |
enum SleepInterval { |
@@ -650,19 +650,28 @@ |
: Thread("SignalSender"), |
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 { |
@@ -678,12 +687,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(); |
} |
} |
@@ -695,6 +699,12 @@ |
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) { |