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
35namespace v8 {
36namespace internal {
37
38static const int kSweeperThreadStackSize = 64 * KB;
39
40SweeperThread::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
57void 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
82intptr_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
92void 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
100void SweeperThread::StartSweeping() {
101  start_sweeping_semaphore_->Signal();
102}
103
104
105void SweeperThread::WaitForSweeperThread() {
106  end_sweeping_semaphore_->Wait();
107}
108} }  // namespace v8::internal
109