| Index: src/platform-linux.cc
 | 
| diff --git a/src/platform-linux.cc b/src/platform-linux.cc
 | 
| index bf5565965a4b9bd028fb752a036662130798565c..5609af0e87ed9c12131cde9391abd50317193fc1 100644
 | 
| --- a/src/platform-linux.cc
 | 
| +++ b/src/platform-linux.cc
 | 
| @@ -1025,6 +1025,7 @@ static int GetThreadID() {
 | 
|  static void ProfilerSignalHandler(int signal, siginfo_t* info, void* context) {
 | 
|    USE(info);
 | 
|    if (signal != SIGPROF) return;
 | 
| +
 | 
|    Isolate* isolate = Isolate::UncheckedCurrent();
 | 
|    if (isolate == NULL || !isolate->IsInitialized() || !isolate->IsInUse()) {
 | 
|      // We require a fully initialized and entered isolate.
 | 
| @@ -1038,8 +1039,9 @@ static void ProfilerSignalHandler(int signal, siginfo_t* info, void* context) {
 | 
|    Sampler* sampler = isolate->logger()->sampler();
 | 
|    if (sampler == NULL || !sampler->IsActive()) return;
 | 
|  
 | 
| +  TickSample sample_obj;
 | 
|    TickSample* sample = CpuProfiler::StartTickSampleEvent(isolate);
 | 
| -  if (sample == NULL) return;
 | 
| +  if (sample == NULL) sample = &sample_obj;
 | 
|  
 | 
|    // Extracting the sample from the context is extremely machine dependent.
 | 
|    ucontext_t* ucontext = reinterpret_cast<ucontext_t*>(context);
 | 
| @@ -1190,16 +1192,45 @@ class SignalSender : public Thread {
 | 
|      SamplerRegistry::State state;
 | 
|      while ((state = SamplerRegistry::GetState()) !=
 | 
|             SamplerRegistry::HAS_NO_SAMPLERS) {
 | 
| -      if (rate_limiter_.SuspendIfNecessary()) continue;
 | 
| -      if (RuntimeProfiler::IsEnabled()) {
 | 
| +      bool cpu_profiling_enabled =
 | 
| +          (state == SamplerRegistry::HAS_CPU_PROFILING_SAMPLERS);
 | 
| +      bool runtime_profiler_enabled = RuntimeProfiler::IsEnabled();
 | 
| +      // When CPU profiling is enabled both JavaScript and C++ code is
 | 
| +      // profiled. We must not suspend.
 | 
| +      if (!cpu_profiling_enabled) {
 | 
| +        if (rate_limiter_.SuspendIfNecessary()) continue;
 | 
| +      }
 | 
| +      if (cpu_profiling_enabled && runtime_profiler_enabled) {
 | 
| +        if (!SamplerRegistry::IterateActiveSamplers(&DoCpuProfile, NULL)) {
 | 
| +          return;
 | 
| +        }
 | 
| +        Sleep(HALF_INTERVAL);
 | 
|          if (!SamplerRegistry::IterateActiveSamplers(&DoRuntimeProfile, NULL)) {
 | 
|            return;
 | 
|          }
 | 
| +        Sleep(HALF_INTERVAL);
 | 
| +      } else {
 | 
| +        if (cpu_profiling_enabled) {
 | 
| +          if (!SamplerRegistry::IterateActiveSamplers(&DoCpuProfile, NULL)) {
 | 
| +            return;
 | 
| +          }
 | 
| +        }
 | 
| +        if (runtime_profiler_enabled) {
 | 
| +          if (!SamplerRegistry::IterateActiveSamplers(&DoRuntimeProfile,
 | 
| +                                                      NULL)) {
 | 
| +            return;
 | 
| +          }
 | 
| +        }
 | 
| +        Sleep(FULL_INTERVAL);
 | 
|        }
 | 
| -      Sleep(FULL_INTERVAL);
 | 
|      }
 | 
|    }
 | 
|  
 | 
| +  static void DoCpuProfile(Sampler* sampler, void*) {
 | 
| +    if (!sampler->IsProfiling()) return;
 | 
| +    sampler->platform_data()->SendProfilingSignal();
 | 
| +  }
 | 
| +
 | 
|    static void DoRuntimeProfile(Sampler* sampler, void* ignored) {
 | 
|      if (!sampler->isolate()->IsInitialized()) return;
 | 
|      sampler->isolate()->runtime_profiler()->NotifyTick();
 | 
| @@ -1284,6 +1315,7 @@ Sampler::Sampler(Isolate* isolate, int interval)
 | 
|        interval_(interval),
 | 
|        profiling_(false),
 | 
|        active_(false),
 | 
| +      has_processing_thread_(false),
 | 
|        samples_taken_(0) {
 | 
|    data_ = new PlatformData;
 | 
|  }
 | 
| @@ -1302,7 +1334,6 @@ void Sampler::DoSample() {
 | 
|  
 | 
|  void Sampler::Start() {
 | 
|    ASSERT(!IsActive());
 | 
| -  CpuProfilerSignalHandler::InstallSignalHandler();
 | 
|    SetActive(true);
 | 
|    SignalSender::AddActiveSampler(this);
 | 
|  }
 | 
| @@ -1310,10 +1341,19 @@ void Sampler::Start() {
 | 
|  
 | 
|  void Sampler::Stop() {
 | 
|    ASSERT(IsActive());
 | 
| -  CpuProfilerSignalHandler::RestoreSignalHandler();
 | 
|    SignalSender::RemoveActiveSampler(this);
 | 
|    SetActive(false);
 | 
|  }
 | 
|  
 | 
|  
 | 
| +void Sampler::StartSampling() {
 | 
| +  CpuProfilerSignalHandler::InstallSignalHandler();
 | 
| +}
 | 
| +
 | 
| +
 | 
| +void Sampler::StopSampling() {
 | 
| +  CpuProfilerSignalHandler::RestoreSignalHandler();
 | 
| +}
 | 
| +
 | 
| +
 | 
|  } }  // namespace v8::internal
 | 
| 
 |