OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (C) 2009 Google Inc. All rights reserved. | 2 * Copyright (C) 2009 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
141 v8::Persistent<v8::Object>::Cast(*value).MarkActive(); | 141 v8::Persistent<v8::Object>::Cast(*value).MarkActive(); |
142 return; | 142 return; |
143 } | 143 } |
144 } | 144 } |
145 } | 145 } |
146 | 146 |
147 private: | 147 private: |
148 v8::Isolate* m_isolate; | 148 v8::Isolate* m_isolate; |
149 }; | 149 }; |
150 | 150 |
151 class HeapSnaphotWrapperVisitor : public ScriptWrappableVisitor { | |
152 public: | |
153 explicit HeapSnaphotWrapperVisitor(v8::Isolate* isolate) | |
154 : ScriptWrappableVisitor(isolate) {} | |
155 | |
156 // Trace through the blink heap to find all V8 wrappers reachable from | |
157 // ActiveScriptWrappables. | |
158 WTF::HashSet<const v8::PersistentBase<v8::Value>*> findPendingWrappers() { | |
159 m_foundV8Wrappers.clear(); | |
160 | |
161 TracePrologue(); | |
162 ActiveScriptWrappableBase::traceActiveScriptWrappables(m_isolate, this); | |
163 AdvanceTracing( | |
164 0, | |
165 v8::EmbedderHeapTracer::AdvanceTracingActions( | |
166 v8::EmbedderHeapTracer::ForceCompletionAction::FORCE_COMPLETION)); | |
167 // Abort instead of Epilogue as we want to finish synchronously. | |
168 AbortTracing(); | |
169 | |
170 return std::move(m_foundV8Wrappers); | |
171 } | |
172 | |
173 // Trace through the blink heap to find all V8 wrappers reachable from | |
174 // |traceable|. | |
175 WTF::HashSet<const v8::PersistentBase<v8::Value>*> | |
176 findV8WrappersReachableFrom(ScriptWrappable* traceable) { | |
177 m_foundV8Wrappers.clear(); | |
178 | |
179 TracePrologue(); | |
180 traceable->wrapperTypeInfo()->traceWrappers(this, traceable); | |
181 AdvanceTracing( | |
182 0, | |
183 v8::EmbedderHeapTracer::AdvanceTracingActions( | |
184 v8::EmbedderHeapTracer::ForceCompletionAction::FORCE_COMPLETION)); | |
185 // Abort instead of Epilogue as we want to finish synchronously. | |
186 AbortTracing(); | |
187 | |
188 return std::move(m_foundV8Wrappers); | |
189 } | |
190 | |
191 void markWrapper(const v8::PersistentBase<v8::Value>* value) const override { | |
192 if (!m_tracingInProgress || m_foundV8Wrappers.contains(value)) | |
193 return; | |
194 m_foundV8Wrappers.add(value); | |
195 } | |
196 | |
197 private: | |
198 mutable WTF::HashSet<const v8::PersistentBase<v8::Value>*> m_foundV8Wrappers; | |
alph
2017/01/12 08:59:00
I wonder why not std::unordered_set ?
Michael Lippautz
2017/01/12 12:23:19
Done. Actually I changed the API type to unodred_s
| |
199 }; | |
200 | |
201 class HeapSnapshotHandlesVisitor : public v8::PersistentHandleVisitor { | |
202 public: | |
203 explicit HeapSnapshotHandlesVisitor(v8::Isolate* isolate) {} | |
204 | |
205 void VisitPersistentHandle(v8::Persistent<v8::Value>* value, | |
206 uint16_t classId) override { | |
207 // TODO: Fill m_nodesRequiringTracing. | |
208 } | |
209 | |
210 WTF::HashSet<UntracedMember<Node>> nodesRequiringTracing() { | |
211 return std::move(m_nodesRequiringTracing); | |
212 } | |
213 | |
214 private: | |
215 WTF::HashSet<UntracedMember<Node>> m_nodesRequiringTracing; | |
216 }; | |
217 | |
218 v8::HeapProfiler::RetainerInfos V8GCController::getRetainerInfos( | |
219 v8::Isolate* isolate) { | |
220 v8::HeapProfiler::RetainerInfos infos; | |
221 HeapSnaphotWrapperVisitor tracer(isolate); | |
222 | |
223 // Find wrappers for pending activities. | |
224 { | |
225 V8PerIsolateData::TemporaryScriptWrappableVisitorScope scope(isolate, | |
226 &tracer); | |
227 std::vector<const v8::PersistentBase<v8::Value>*> wrappers; | |
228 for (auto& wrapper : tracer.findPendingWrappers()) { | |
229 wrappers.push_back(wrapper); | |
230 } | |
231 infos.push_back(std::make_pair(new SuspendableObjectsInfo(wrappers.size()), | |
232 std::move(wrappers))); | |
233 } | |
234 | |
235 // Find wrappers for DOM trees. | |
236 { | |
237 HeapSnapshotHandlesVisitor visitor(isolate); | |
238 // TODO | |
239 } | |
240 | |
241 return infos; | |
242 } | |
243 | |
151 class MajorGCWrapperVisitor : public v8::PersistentHandleVisitor { | 244 class MajorGCWrapperVisitor : public v8::PersistentHandleVisitor { |
152 public: | 245 public: |
153 explicit MajorGCWrapperVisitor(v8::Isolate* isolate, | 246 explicit MajorGCWrapperVisitor(v8::Isolate* isolate, |
154 bool constructRetainedObjectInfos) | 247 bool constructRetainedObjectInfos) |
155 : m_isolate(isolate), | 248 : m_isolate(isolate), |
156 m_domObjectsWithPendingActivity(0), | 249 m_domObjectsWithPendingActivity(0), |
157 m_liveRootGroupIdSet(false), | 250 m_liveRootGroupIdSet(false), |
158 m_constructRetainedObjectInfos(constructRetainedObjectInfos) {} | 251 m_constructRetainedObjectInfos(constructRetainedObjectInfos) {} |
159 | 252 |
160 void VisitPersistentHandle(v8::Persistent<v8::Value>* value, | 253 void VisitPersistentHandle(v8::Persistent<v8::Value>* value, |
(...skipping 383 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
544 double startTime = WTF::currentTimeMS(); | 637 double startTime = WTF::currentTimeMS(); |
545 v8::HandleScope scope(isolate); | 638 v8::HandleScope scope(isolate); |
546 PendingActivityVisitor visitor(isolate, executionContext); | 639 PendingActivityVisitor visitor(isolate, executionContext); |
547 toIsolate(executionContext)->VisitHandlesWithClassIds(&visitor); | 640 toIsolate(executionContext)->VisitHandlesWithClassIds(&visitor); |
548 scanPendingActivityHistogram.count( | 641 scanPendingActivityHistogram.count( |
549 static_cast<int>(WTF::currentTimeMS() - startTime)); | 642 static_cast<int>(WTF::currentTimeMS() - startTime)); |
550 return visitor.pendingActivityFound(); | 643 return visitor.pendingActivityFound(); |
551 } | 644 } |
552 | 645 |
553 } // namespace blink | 646 } // namespace blink |
OLD | NEW |