Home | History | Annotate | Download | only in heap
      1 // Copyright 2012 the V8 project authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "src/heap/sweeper-thread.h"
      6 
      7 #include "src/v8.h"
      8 
      9 #include "src/isolate.h"
     10 #include "src/v8threads.h"
     11 
     12 namespace v8 {
     13 namespace internal {
     14 
     15 static const int kSweeperThreadStackSize = 64 * KB;
     16 
     17 SweeperThread::SweeperThread(Isolate* isolate)
     18     : Thread(Thread::Options("v8:SweeperThread", kSweeperThreadStackSize)),
     19       isolate_(isolate),
     20       heap_(isolate->heap()),
     21       collector_(heap_->mark_compact_collector()),
     22       start_sweeping_semaphore_(0),
     23       end_sweeping_semaphore_(0),
     24       stop_semaphore_(0) {
     25   DCHECK(!FLAG_job_based_sweeping);
     26   base::NoBarrier_Store(&stop_thread_, static_cast<base::AtomicWord>(false));
     27 }
     28 
     29 
     30 void SweeperThread::Run() {
     31   Isolate::SetIsolateThreadLocals(isolate_, NULL);
     32   DisallowHeapAllocation no_allocation;
     33   DisallowHandleAllocation no_handles;
     34   DisallowHandleDereference no_deref;
     35 
     36   while (true) {
     37     start_sweeping_semaphore_.Wait();
     38 
     39     if (base::Acquire_Load(&stop_thread_)) {
     40       stop_semaphore_.Signal();
     41       return;
     42     }
     43 
     44     collector_->SweepInParallel(heap_->old_data_space(), 0);
     45     collector_->SweepInParallel(heap_->old_pointer_space(), 0);
     46     end_sweeping_semaphore_.Signal();
     47   }
     48 }
     49 
     50 
     51 void SweeperThread::Stop() {
     52   base::Release_Store(&stop_thread_, static_cast<base::AtomicWord>(true));
     53   start_sweeping_semaphore_.Signal();
     54   stop_semaphore_.Wait();
     55   Join();
     56 }
     57 
     58 
     59 void SweeperThread::StartSweeping() { start_sweeping_semaphore_.Signal(); }
     60 
     61 
     62 void SweeperThread::WaitForSweeperThread() { end_sweeping_semaphore_.Wait(); }
     63 
     64 
     65 bool SweeperThread::SweepingCompleted() {
     66   bool value = end_sweeping_semaphore_.WaitFor(base::TimeDelta::FromSeconds(0));
     67   if (value) {
     68     end_sweeping_semaphore_.Signal();
     69   }
     70   return value;
     71 }
     72 
     73 
     74 int SweeperThread::NumberOfThreads(int max_available) {
     75   if (!FLAG_concurrent_sweeping && !FLAG_parallel_sweeping) return 0;
     76   if (FLAG_sweeper_threads > 0) return FLAG_sweeper_threads;
     77   if (FLAG_concurrent_sweeping) return max_available - 1;
     78   DCHECK(FLAG_parallel_sweeping);
     79   return max_available;
     80 }
     81 }
     82 }  // namespace v8::internal
     83