Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(183)

Side by Side Diff: src/heap/mark-compact.h

Issue 2454693002: Revert of [heap] Uncommit marking deque in concurrent task. (Closed)
Patch Set: Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | src/heap/mark-compact.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef V8_HEAP_MARK_COMPACT_H_ 5 #ifndef V8_HEAP_MARK_COMPACT_H_
6 #define V8_HEAP_MARK_COMPACT_H_ 6 #define V8_HEAP_MARK_COMPACT_H_
7 7
8 #include <deque> 8 #include <deque>
9 9
10 #include "src/base/bits.h" 10 #include "src/base/bits.h"
11 #include "src/base/platform/condition-variable.h"
12 #include "src/cancelable-task.h"
13 #include "src/heap/marking.h" 11 #include "src/heap/marking.h"
14 #include "src/heap/spaces.h" 12 #include "src/heap/spaces.h"
15 #include "src/heap/store-buffer.h" 13 #include "src/heap/store-buffer.h"
16 14
17 namespace v8 { 15 namespace v8 {
18 namespace internal { 16 namespace internal {
19 17
20 // Callback function, returns whether an object is alive. The heap size 18 // Callback function, returns whether an object is alive. The heap size
21 // of the object is returned in size. It optionally updates the offset 19 // of the object is returned in size. It optionally updates the offset
22 // to the first live object in the page (only used for old and map objects). 20 // to the first live object in the page (only used for old and map objects).
(...skipping 24 matching lines...) Expand all
47 } 45 }
48 46
49 private: 47 private:
50 DISALLOW_IMPLICIT_CONSTRUCTORS(ObjectMarking); 48 DISALLOW_IMPLICIT_CONSTRUCTORS(ObjectMarking);
51 }; 49 };
52 50
53 // ---------------------------------------------------------------------------- 51 // ----------------------------------------------------------------------------
54 // Marking deque for tracing live objects. 52 // Marking deque for tracing live objects.
55 class MarkingDeque { 53 class MarkingDeque {
56 public: 54 public:
57 explicit MarkingDeque(Heap* heap) 55 MarkingDeque()
58 : backing_store_(nullptr), 56 : backing_store_(nullptr),
59 backing_store_committed_size_(0), 57 backing_store_committed_size_(0),
60 array_(nullptr), 58 array_(nullptr),
61 top_(0), 59 top_(0),
62 bottom_(0), 60 bottom_(0),
63 mask_(0), 61 mask_(0),
64 overflowed_(false), 62 overflowed_(false),
65 in_use_(false), 63 in_use_(false) {}
66 uncommit_task_pending_(false),
67 uncommit_task_id_(0),
68 heap_(heap) {}
69 64
70 void SetUp(); 65 void SetUp();
71 void TearDown(); 66 void TearDown();
72 67
73 // Ensures that the marking deque is committed and will stay committed until
74 // StopUsing() is called.
75 void StartUsing(); 68 void StartUsing();
76 void StopUsing(); 69 void StopUsing();
77 void Clear(); 70 void Clear();
78 71
79 inline bool IsFull() { return ((top_ + 1) & mask_) == bottom_; } 72 inline bool IsFull() { return ((top_ + 1) & mask_) == bottom_; }
80 73
81 inline bool IsEmpty() { return top_ == bottom_; } 74 inline bool IsEmpty() { return top_ == bottom_; }
82 75
83 bool overflowed() const { return overflowed_; } 76 bool overflowed() const { return overflowed_; }
84 77
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
122 } 115 }
123 } 116 }
124 117
125 HeapObject** array() { return array_; } 118 HeapObject** array() { return array_; }
126 int bottom() { return bottom_; } 119 int bottom() { return bottom_; }
127 int top() { return top_; } 120 int top() { return top_; }
128 int mask() { return mask_; } 121 int mask() { return mask_; }
129 void set_top(int top) { top_ = top; } 122 void set_top(int top) { top_ = top; }
130 123
131 private: 124 private:
132 // This task uncommits the marking_deque backing store if
133 // markin_deque->in_use_ is false.
134 class UncommitTask : public CancelableTask {
135 public:
136 explicit UncommitTask(Isolate* isolate, MarkingDeque* marking_deque)
137 : CancelableTask(isolate), marking_deque_(marking_deque) {}
138
139 private:
140 // CancelableTask override.
141 void RunInternal() override {
142 base::LockGuard<base::Mutex> guard(&marking_deque_->mutex_);
143 if (!marking_deque_->in_use_) {
144 marking_deque_->Uncommit();
145 }
146 marking_deque_->uncommit_task_pending_ = false;
147 marking_deque_->uncommit_task_barrier_.NotifyOne();
148 }
149
150 MarkingDeque* marking_deque_;
151 DISALLOW_COPY_AND_ASSIGN(UncommitTask);
152 };
153
154 static const size_t kMaxSize = 4 * MB; 125 static const size_t kMaxSize = 4 * MB;
155 static const size_t kMinSize = 256 * KB; 126 static const size_t kMinSize = 256 * KB;
156 127
157 // Must be called with mutex lock.
158 void EnsureCommitted(); 128 void EnsureCommitted();
159
160 // Must be called with mutex lock.
161 void Uncommit(); 129 void Uncommit();
162 130
163 // Must be called with mutex lock.
164 void StartUncommitTask();
165
166 void CancelOrWaitForUncommitTask();
167
168 base::Mutex mutex_;
169 base::ConditionVariable uncommit_task_barrier_;
170
171 base::VirtualMemory* backing_store_; 131 base::VirtualMemory* backing_store_;
172 size_t backing_store_committed_size_; 132 size_t backing_store_committed_size_;
173 HeapObject** array_; 133 HeapObject** array_;
174 // array_[(top - 1) & mask_] is the top element in the deque. The Deque is 134 // array_[(top - 1) & mask_] is the top element in the deque. The Deque is
175 // empty when top_ == bottom_. It is full when top_ + 1 == bottom 135 // empty when top_ == bottom_. It is full when top_ + 1 == bottom
176 // (mod mask + 1). 136 // (mod mask + 1).
177 int top_; 137 int top_;
178 int bottom_; 138 int bottom_;
179 int mask_; 139 int mask_;
180 bool overflowed_; 140 bool overflowed_;
181 // in_use_ == true after taking mutex lock implies that the marking deque is
182 // committed and will stay committed at least until in_use_ == false.
183 bool in_use_; 141 bool in_use_;
184 bool uncommit_task_pending_;
185 uint32_t uncommit_task_id_;
186 Heap* heap_;
187 142
188 DISALLOW_COPY_AND_ASSIGN(MarkingDeque); 143 DISALLOW_COPY_AND_ASSIGN(MarkingDeque);
189 }; 144 };
190 145
191 146
192 // CodeFlusher collects candidates for code flushing during marking and 147 // CodeFlusher collects candidates for code flushing during marking and
193 // processes those candidates after marking has completed in order to 148 // processes those candidates after marking has completed in order to
194 // reset those functions referencing code objects that would otherwise 149 // reset those functions referencing code objects that would otherwise
195 // be unreachable. Code objects can be referenced in two ways: 150 // be unreachable. Code objects can be referenced in two ways:
196 // - SharedFunctionInfo references unoptimized code. 151 // - SharedFunctionInfo references unoptimized code.
(...skipping 578 matching lines...) Expand 10 before | Expand all | Expand 10 after
775 730
776 private: 731 private:
777 MarkCompactCollector* collector_; 732 MarkCompactCollector* collector_;
778 }; 733 };
779 734
780 V8_EXPORT_PRIVATE const char* AllocationSpaceName(AllocationSpace space); 735 V8_EXPORT_PRIVATE const char* AllocationSpaceName(AllocationSpace space);
781 } // namespace internal 736 } // namespace internal
782 } // namespace v8 737 } // namespace v8
783 738
784 #endif // V8_HEAP_MARK_COMPACT_H_ 739 #endif // V8_HEAP_MARK_COMPACT_H_
OLDNEW
« no previous file with comments | « no previous file | src/heap/mark-compact.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698