Index: src/sampler.cc |
diff --git a/src/sampler.cc b/src/sampler.cc |
index 85597e560641fe21135ada1b52dc5db58a95e38d..0aaa1e9b77eedf846cede81117f3406ae9333481 100644 |
--- a/src/sampler.cc |
+++ b/src/sampler.cc |
@@ -248,8 +248,25 @@ class SimulatorHelper { |
class SignalHandler : public AllStatic { |
public: |
- static inline void EnsureInstalled() { |
- if (signal_handler_installed_) return; |
+ static void SetUp() { if (!mutex_) mutex_ = new Mutex(); } |
+ static void TearDown() { delete mutex_; } |
+ |
+ static void IncreaseSamplerCount() { |
+ LockGuard<Mutex> lock_guard(mutex_); |
+ if (++client_count_ == 1) Install(); |
+ } |
+ |
+ static void DecreaseSamplerCount() { |
+ LockGuard<Mutex> lock_guard(mutex_); |
+ if (--client_count_ == 0) Restore(); |
+ } |
+ |
+ static bool Installed() { |
+ return signal_handler_installed_; |
+ } |
+ |
+ private: |
+ static void Install() { |
struct sigaction sa; |
sa.sa_sigaction = &HandleProfilerSignal; |
sigemptyset(&sa.sa_mask); |
@@ -258,23 +275,24 @@ class SignalHandler : public AllStatic { |
(sigaction(SIGPROF, &sa, &old_signal_handler_) == 0); |
} |
- static inline void Restore() { |
+ static void Restore() { |
if (signal_handler_installed_) { |
sigaction(SIGPROF, &old_signal_handler_, 0); |
signal_handler_installed_ = false; |
} |
} |
- static inline bool Installed() { |
- return signal_handler_installed_; |
- } |
- |
- private: |
static void HandleProfilerSignal(int signal, siginfo_t* info, void* context); |
+ // Protects the process wide state below. |
+ static Mutex* mutex_; |
+ static int client_count_; |
static bool signal_handler_installed_; |
static struct sigaction old_signal_handler_; |
}; |
+ |
+Mutex* SignalHandler::mutex_ = NULL; |
+int SignalHandler::client_count_ = 0; |
struct sigaction SignalHandler::old_signal_handler_; |
bool SignalHandler::signal_handler_installed_ = false; |
@@ -299,7 +317,7 @@ void SignalHandler::HandleProfilerSignal(int signal, siginfo_t* info, |
} |
Sampler* sampler = isolate->logger()->sampler(); |
- if (sampler == NULL || !sampler->IsActive()) return; |
+ if (sampler == NULL) return; |
RegisterState state; |
@@ -436,9 +454,6 @@ class SamplerThread : public Thread { |
ASSERT(instance_->interval_ == sampler->interval()); |
instance_->active_samplers_.Add(sampler); |
-#if defined(USE_SIGNALS) |
- SignalHandler::EnsureInstalled(); |
-#endif |
if (need_to_start) instance_->StartSynchronously(); |
} |
@@ -457,9 +472,6 @@ class SamplerThread : public Thread { |
if (instance_->active_samplers_.is_empty()) { |
instance_to_remove = instance_; |
instance_ = NULL; |
-#if defined(USE_SIGNALS) |
- SignalHandler::Restore(); |
-#endif |
} |
} |
@@ -548,12 +560,18 @@ DISABLE_ASAN void TickSample::Init(Isolate* isolate, |
void Sampler::SetUp() { |
+#if defined(USE_SIGNALS) |
+ SignalHandler::SetUp(); |
+#endif |
SamplerThread::SetUp(); |
} |
void Sampler::TearDown() { |
SamplerThread::TearDown(); |
+#if defined(USE_SIGNALS) |
+ SignalHandler::TearDown(); |
+#endif |
} |
@@ -589,6 +607,22 @@ void Sampler::Stop() { |
} |
+void Sampler::IncreaseProfilingDepth() { |
+ NoBarrier_AtomicIncrement(&profiling_, 1); |
+#if defined(USE_SIGNALS) |
+ SignalHandler::IncreaseSamplerCount(); |
+#endif |
+} |
+ |
+ |
+void Sampler::DecreaseProfilingDepth() { |
+#if defined(USE_SIGNALS) |
+ SignalHandler::DecreaseSamplerCount(); |
+#endif |
+ NoBarrier_AtomicIncrement(&profiling_, -1); |
+} |
+ |
+ |
void Sampler::SampleStack(const RegisterState& state) { |
TickSample* sample = isolate_->cpu_profiler()->StartTickSample(); |
TickSample sample_obj; |
@@ -606,17 +640,6 @@ void Sampler::SampleStack(const RegisterState& state) { |
} |
-bool Sampler::CanSampleOnProfilerEventsProcessorThread() { |
-#if defined(USE_SIGNALS) |
- return true; |
-#elif V8_OS_WIN || V8_OS_CYGWIN |
- return true; |
-#else |
- return false; |
-#endif |
-} |
- |
- |
#if defined(USE_SIGNALS) |
void Sampler::DoSample() { |