Home | History | Annotate | Download | only in src
      1 // Copyright 2012 the V8 project authors. All rights reserved.
      2 // Redistribution and use in source and binary forms, with or without
      3 // modification, are permitted provided that the following conditions are
      4 // met:
      5 //
      6 //     * Redistributions of source code must retain the above copyright
      7 //       notice, this list of conditions and the following disclaimer.
      8 //     * Redistributions in binary form must reproduce the above
      9 //       copyright notice, this list of conditions and the following
     10 //       disclaimer in the documentation and/or other materials provided
     11 //       with the distribution.
     12 //     * Neither the name of Google Inc. nor the names of its
     13 //       contributors may be used to endorse or promote products derived
     14 //       from this software without specific prior written permission.
     15 //
     16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     27 
     28 #include "sweeper-thread.h"
     29 
     30 #include "v8.h"
     31 
     32 #include "isolate.h"
     33 #include "v8threads.h"
     34 
     35 namespace v8 {
     36 namespace internal {
     37 
     38 static const int kSweeperThreadStackSize = 64 * KB;
     39 
     40 SweeperThread::SweeperThread(Isolate* isolate)
     41      : Thread(Thread::Options("v8:SweeperThread", kSweeperThreadStackSize)),
     42        isolate_(isolate),
     43        heap_(isolate->heap()),
     44        collector_(heap_->mark_compact_collector()),
     45        start_sweeping_semaphore_(OS::CreateSemaphore(0)),
     46        end_sweeping_semaphore_(OS::CreateSemaphore(0)),
     47        stop_semaphore_(OS::CreateSemaphore(0)),
     48        free_list_old_data_space_(heap_->paged_space(OLD_DATA_SPACE)),
     49        free_list_old_pointer_space_(heap_->paged_space(OLD_POINTER_SPACE)),
     50        private_free_list_old_data_space_(heap_->paged_space(OLD_DATA_SPACE)),
     51        private_free_list_old_pointer_space_(
     52            heap_->paged_space(OLD_POINTER_SPACE)) {
     53   NoBarrier_Store(&stop_thread_, static_cast<AtomicWord>(false));
     54 }
     55 
     56 
     57 void SweeperThread::Run() {
     58   Isolate::SetIsolateThreadLocals(isolate_, NULL);
     59   DisallowHeapAllocation no_allocation;
     60   DisallowHandleAllocation no_handles;
     61   DisallowHandleDereference no_deref;
     62 
     63   while (true) {
     64     start_sweeping_semaphore_->Wait();
     65 
     66     if (Acquire_Load(&stop_thread_)) {
     67       stop_semaphore_->Signal();
     68       return;
     69     }
     70 
     71     collector_->SweepInParallel(heap_->old_data_space(),
     72                                 &private_free_list_old_data_space_,
     73                                 &free_list_old_data_space_);
     74     collector_->SweepInParallel(heap_->old_pointer_space(),
     75                                 &private_free_list_old_pointer_space_,
     76                                 &free_list_old_pointer_space_);
     77     end_sweeping_semaphore_->Signal();
     78   }
     79 }
     80 
     81 
     82 intptr_t SweeperThread::StealMemory(PagedSpace* space) {
     83   if (space->identity() == OLD_POINTER_SPACE) {
     84     return space->free_list()->Concatenate(&free_list_old_pointer_space_);
     85   } else if (space->identity() == OLD_DATA_SPACE) {
     86     return space->free_list()->Concatenate(&free_list_old_data_space_);
     87   }
     88   return 0;
     89 }
     90 
     91 
     92 void SweeperThread::Stop() {
     93   Release_Store(&stop_thread_, static_cast<AtomicWord>(true));
     94   start_sweeping_semaphore_->Signal();
     95   stop_semaphore_->Wait();
     96   Join();
     97 }
     98 
     99 
    100 void SweeperThread::StartSweeping() {
    101   start_sweeping_semaphore_->Signal();
    102 }
    103 
    104 
    105 void SweeperThread::WaitForSweeperThread() {
    106   end_sweeping_semaphore_->Wait();
    107 }
    108 } }  // namespace v8::internal
    109