OLD | NEW |
| (Empty) |
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 | |
OLD | NEW |