| Index: src/profiler/sampler.cc | 
| diff --git a/src/profiler/sampler.cc b/src/profiler/sampler.cc | 
| index 3c597a4beb7cb6c6e0eb9282efbdd74528e5ae9b..a34042453c902d25a2ced72494a47fe4896e9263 100644 | 
| --- a/src/profiler/sampler.cc | 
| +++ b/src/profiler/sampler.cc | 
| @@ -42,7 +42,6 @@ | 
|  | 
| #endif | 
|  | 
| -#include "src/atomic-utils.h" | 
| #include "src/base/platform/platform.h" | 
| #include "src/flags.h" | 
| #include "src/frames-inl.h" | 
| @@ -237,50 +236,6 @@ | 
| return false; | 
| } | 
|  | 
| -typedef List<Sampler*> SamplerList; | 
| - | 
| -#if defined(USE_SIGNALS) | 
| -class AtomicGuard { | 
| - public: | 
| -  explicit AtomicGuard(AtomicValue<int>* atomic, bool is_block = true) | 
| -      : atomic_(atomic), | 
| -        is_success_(false) { | 
| -    do { | 
| -      is_success_ = atomic_->TrySetValue(0, 1); | 
| -    } while (is_block && !is_success_); | 
| -  } | 
| - | 
| -  bool is_success() { return is_success_; } | 
| - | 
| -  ~AtomicGuard() { | 
| -    if (is_success_) { | 
| -      atomic_->SetValue(0); | 
| -    } | 
| -    atomic_ = NULL; | 
| -  } | 
| - | 
| - private: | 
| -  AtomicValue<int>* atomic_; | 
| -  bool is_success_; | 
| -}; | 
| - | 
| - | 
| -// Returns key for hash map. | 
| -void* ThreadKey(pthread_t thread_id) { | 
| -  return reinterpret_cast<void*>(thread_id); | 
| -} | 
| - | 
| - | 
| -// Returns hash value for hash map. | 
| -uint32_t ThreadHash(pthread_t thread_id) { | 
| -#if V8_OS_MACOSX | 
| -  return static_cast<uint32_t>(reinterpret_cast<intptr_t>(thread_id)); | 
| -#else | 
| -  return static_cast<uint32_t>(thread_id); | 
| -#endif | 
| -} | 
| -#endif  // USE_SIGNALS | 
| - | 
| }  // namespace | 
|  | 
| #if defined(USE_SIGNALS) | 
| @@ -419,10 +374,6 @@ | 
| return signal_handler_installed_; | 
| } | 
|  | 
| -#if !V8_OS_NACL | 
| -  static void CollectSample(void* context, Sampler* sampler); | 
| -#endif | 
| - | 
| private: | 
| static void Install() { | 
| #if !V8_OS_NACL | 
| @@ -467,20 +418,22 @@ | 
|  | 
| // As Native Client does not support signal handling, profiling is disabled. | 
| #if !V8_OS_NACL | 
| -void SignalHandler::CollectSample(void* context, Sampler* sampler) { | 
| -  if (sampler == NULL || (!sampler->IsProfiling() && | 
| -                          !sampler->IsRegistered())) { | 
| +void SignalHandler::HandleProfilerSignal(int signal, siginfo_t* info, | 
| +                                         void* context) { | 
| +  USE(info); | 
| +  if (signal != SIGPROF) return; | 
| +  Isolate* isolate = Isolate::UnsafeCurrent(); | 
| +  if (isolate == NULL || !isolate->IsInUse()) { | 
| +    // We require a fully initialized and entered isolate. | 
| return; | 
| } | 
| -  Isolate* isolate = sampler->isolate(); | 
| - | 
| -  // We require a fully initialized and entered isolate. | 
| -  if (isolate == NULL || !isolate->IsInUse()) return; | 
| - | 
| if (v8::Locker::IsActive() && | 
| !isolate->thread_manager()->IsLockedByCurrentThread()) { | 
| return; | 
| } | 
| + | 
| +  Sampler* sampler = isolate->logger()->sampler(); | 
| +  if (sampler == NULL) return; | 
|  | 
| v8::RegisterState state; | 
|  | 
| @@ -629,7 +582,7 @@ | 
| } | 
| #endif  // V8_OS_NACL | 
|  | 
| -#endif  // USE_SIGNALS | 
| +#endif | 
|  | 
|  | 
| class SamplerThread : public base::Thread { | 
| @@ -654,46 +607,19 @@ | 
| } | 
|  | 
| DCHECK(sampler->IsActive()); | 
| +    DCHECK(!instance_->active_samplers_.Contains(sampler)); | 
| DCHECK(instance_->interval_ == sampler->interval()); | 
| - | 
| -#if defined(USE_SIGNALS) | 
| -    AddSampler(sampler); | 
| -#else | 
| -    DCHECK(!instance_->active_samplers_.Contains(sampler)); | 
| instance_->active_samplers_.Add(sampler); | 
| -#endif  // USE_SIGNALS | 
|  | 
| if (need_to_start) instance_->StartSynchronously(); | 
| } | 
|  | 
| -  static void RemoveSampler(Sampler* sampler) { | 
| +  static void RemoveActiveSampler(Sampler* sampler) { | 
| SamplerThread* instance_to_remove = NULL; | 
| { | 
| base::LockGuard<base::Mutex> lock_guard(mutex_); | 
|  | 
| -      DCHECK(sampler->IsActive() || sampler->IsRegistered()); | 
| -#if defined(USE_SIGNALS) | 
| -      { | 
| -        AtomicGuard atomic_guard(&sampler_list_access_counter_); | 
| -        // Remove sampler from map. | 
| -        pthread_t thread_id = sampler->platform_data()->vm_tid(); | 
| -        void* thread_key = ThreadKey(thread_id); | 
| -        uint32_t thread_hash = ThreadHash(thread_id); | 
| -        HashMap::Entry* entry = | 
| -            thread_id_to_samplers_.Get().Lookup(thread_key, thread_hash); | 
| -        DCHECK(entry != NULL); | 
| -        SamplerList* samplers = reinterpret_cast<SamplerList*>(entry->value); | 
| -        samplers->RemoveElement(sampler); | 
| -        if (samplers->is_empty()) { | 
| -          thread_id_to_samplers_.Pointer()->Remove(thread_key, thread_hash); | 
| -          delete samplers; | 
| -        } | 
| -        if (thread_id_to_samplers_.Get().occupancy() == 0) { | 
| -          instance_to_remove = instance_; | 
| -          instance_ = NULL; | 
| -        } | 
| -      } | 
| -#else | 
| +      DCHECK(sampler->IsActive()); | 
| bool removed = instance_->active_samplers_.RemoveElement(sampler); | 
| DCHECK(removed); | 
| USE(removed); | 
| @@ -704,21 +630,11 @@ | 
| instance_to_remove = instance_; | 
| instance_ = NULL; | 
| } | 
| -#endif  // USE_SIGNALS | 
| } | 
|  | 
| if (!instance_to_remove) return; | 
| instance_to_remove->Join(); | 
| delete instance_to_remove; | 
| -  } | 
| - | 
| -  // Unlike AddActiveSampler, this method only adds a sampler, | 
| -  // but won't start the sampler thread. | 
| -  static void RegisterSampler(Sampler* sampler) { | 
| -    base::LockGuard<base::Mutex> lock_guard(mutex_); | 
| -#if defined(USE_SIGNALS) | 
| -    AddSampler(sampler); | 
| -#endif  // USE_SIGNALS | 
| } | 
|  | 
| // Implement Thread::Run(). | 
| @@ -726,16 +642,6 @@ | 
| while (true) { | 
| { | 
| base::LockGuard<base::Mutex> lock_guard(mutex_); | 
| -#if defined(USE_SIGNALS) | 
| -        if (thread_id_to_samplers_.Get().occupancy() == 0) break; | 
| -        if (SignalHandler::Installed()) { | 
| -          for (HashMap::Entry *p = thread_id_to_samplers_.Get().Start(); | 
| -               p != NULL; p = thread_id_to_samplers_.Get().Next(p)) { | 
| -            pthread_t thread_id = reinterpret_cast<pthread_t>(p->key); | 
| -            pthread_kill(thread_id, SIGPROF); | 
| -          } | 
| -        } | 
| -#else | 
| if (active_samplers_.is_empty()) break; | 
| // When CPU profiling is enabled both JavaScript and C++ code is | 
| // profiled. We must not suspend. | 
| @@ -744,7 +650,6 @@ | 
| if (!sampler->IsProfiling()) continue; | 
| sampler->DoSample(); | 
| } | 
| -#endif  // USE_SIGNALS | 
| } | 
| base::OS::Sleep(base::TimeDelta::FromMilliseconds(interval_)); | 
| } | 
| @@ -756,38 +661,7 @@ | 
| static SamplerThread* instance_; | 
|  | 
| const int interval_; | 
| - | 
| -#if defined(USE_SIGNALS) | 
| -  struct HashMapCreateTrait { | 
| -    static void Construct(HashMap* allocated_ptr) { | 
| -      new (allocated_ptr) HashMap(HashMap::PointersMatch); | 
| -    } | 
| -  }; | 
| -  friend class SignalHandler; | 
| -  static base::LazyInstance<HashMap, HashMapCreateTrait>::type | 
| -      thread_id_to_samplers_; | 
| -  static AtomicValue<int> sampler_list_access_counter_; | 
| -  static void AddSampler(Sampler* sampler) { | 
| -    AtomicGuard atomic_guard(&sampler_list_access_counter_); | 
| -    // Add sampler into map if needed. | 
| -    pthread_t thread_id = sampler->platform_data()->vm_tid(); | 
| -    HashMap::Entry *entry = | 
| -        thread_id_to_samplers_.Pointer()->LookupOrInsert(ThreadKey(thread_id), | 
| -                                                         ThreadHash(thread_id)); | 
| -    if (entry->value == NULL) { | 
| -      SamplerList* samplers = new SamplerList(); | 
| -      samplers->Add(sampler); | 
| -      entry->value = samplers; | 
| -    } else { | 
| -      SamplerList* samplers = reinterpret_cast<SamplerList*>(entry->value); | 
| -      if (!samplers->Contains(sampler)) { | 
| -        samplers->Add(sampler); | 
| -      } | 
| -    } | 
| -  } | 
| -#else | 
| -  SamplerList active_samplers_; | 
| -#endif  // USE_SIGNALS | 
| +  List<Sampler*> active_samplers_; | 
|  | 
| DISALLOW_COPY_AND_ASSIGN(SamplerThread); | 
| }; | 
| @@ -795,33 +669,6 @@ | 
|  | 
| base::Mutex* SamplerThread::mutex_ = NULL; | 
| SamplerThread* SamplerThread::instance_ = NULL; | 
| -#if defined(USE_SIGNALS) | 
| -base::LazyInstance<HashMap, SamplerThread::HashMapCreateTrait>::type | 
| -    SamplerThread::thread_id_to_samplers_ = LAZY_INSTANCE_INITIALIZER; | 
| -AtomicValue<int> SamplerThread::sampler_list_access_counter_(0); | 
| - | 
| -// As Native Client does not support signal handling, profiling is disabled. | 
| -#if !V8_OS_NACL | 
| -void SignalHandler::HandleProfilerSignal(int signal, siginfo_t* info, | 
| -                                         void* context) { | 
| -  USE(info); | 
| -  if (signal != SIGPROF) return; | 
| -  AtomicGuard atomic_guard(&SamplerThread::sampler_list_access_counter_, false); | 
| -  if (!atomic_guard.is_success()) return; | 
| -  pthread_t thread_id = pthread_self(); | 
| -  HashMap::Entry* entry = | 
| -      SamplerThread::thread_id_to_samplers_.Pointer()->Lookup( | 
| -          ThreadKey(thread_id), ThreadHash(thread_id)); | 
| -  if (entry == NULL) | 
| -    return; | 
| -  SamplerList* samplers = reinterpret_cast<SamplerList*>(entry->value); | 
| -  for (int i = 0; i < samplers->length(); ++i) { | 
| -    Sampler* sampler = samplers->at(i); | 
| -    CollectSample(context, sampler); | 
| -  } | 
| -} | 
| -#endif  // !V8_OS_NACL | 
| -#endif  // USE_SIGNALs | 
|  | 
|  | 
| // | 
| @@ -942,7 +789,6 @@ | 
| profiling_(false), | 
| has_processing_thread_(false), | 
| active_(false), | 
| -      registered_(false), | 
| is_counting_samples_(false), | 
| js_sample_count_(0), | 
| external_sample_count_(0) { | 
| @@ -951,9 +797,6 @@ | 
|  | 
| Sampler::~Sampler() { | 
| DCHECK(!IsActive()); | 
| -  if (IsRegistered()) { | 
| -    SamplerThread::RemoveSampler(this); | 
| -  } | 
| delete data_; | 
| } | 
|  | 
| @@ -966,9 +809,8 @@ | 
|  | 
| void Sampler::Stop() { | 
| DCHECK(IsActive()); | 
| -  SamplerThread::RemoveSampler(this); | 
| +  SamplerThread::RemoveActiveSampler(this); | 
| SetActive(false); | 
| -  SetRegistered(false); | 
| } | 
|  | 
|  | 
| @@ -1008,10 +850,6 @@ | 
|  | 
| void Sampler::DoSample() { | 
| if (!SignalHandler::Installed()) return; | 
| -  if (!IsActive() && !IsRegistered()) { | 
| -    SamplerThread::RegisterSampler(this); | 
| -    SetRegistered(true); | 
| -  } | 
| pthread_kill(platform_data()->vm_tid(), SIGPROF); | 
| } | 
|  | 
|  |