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 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
101 } | 101 } |
102 | 102 |
103 // Regarding a minor GC algorithm for DOM nodes, see this document: | 103 // Regarding a minor GC algorithm for DOM nodes, see this document: |
104 // https://docs.google.com/a/google.com/presentation/d/1uifwVYGNYTZDoGLyCb7sXa7g
49mWNMW2gaWvMN5NLk8/edit#slide=id.p | 104 // https://docs.google.com/a/google.com/presentation/d/1uifwVYGNYTZDoGLyCb7sXa7g
49mWNMW2gaWvMN5NLk8/edit#slide=id.p |
105 class MinorGCWrapperVisitor : public v8::PersistentHandleVisitor { | 105 class MinorGCWrapperVisitor : public v8::PersistentHandleVisitor { |
106 public: | 106 public: |
107 explicit MinorGCWrapperVisitor(v8::Isolate* isolate) | 107 explicit MinorGCWrapperVisitor(v8::Isolate* isolate) |
108 : m_isolate(isolate) | 108 : m_isolate(isolate) |
109 { } | 109 { } |
110 | 110 |
111 virtual void VisitPersistentHandle(v8::Persistent<v8::Value>* value, uint16_
t classId) override | 111 void VisitPersistentHandle(v8::Persistent<v8::Value>* value, uint16_t classI
d) override |
112 { | 112 { |
113 // A minor DOM GC can collect only Nodes. | 113 // A minor DOM GC can collect only Nodes. |
114 if (classId != WrapperTypeInfo::NodeClassId) | 114 if (classId != WrapperTypeInfo::NodeClassId) |
115 return; | 115 return; |
116 | 116 |
117 // To make minor GC cycle time bounded, we limit the number of wrappers
handled | 117 // To make minor GC cycle time bounded, we limit the number of wrappers
handled |
118 // by each minor GC cycle to 10000. This value was selected so that the
minor | 118 // by each minor GC cycle to 10000. This value was selected so that the
minor |
119 // GC cycle time is bounded to 20 ms in a case where the new space size | 119 // GC cycle time is bounded to 20 ms in a case where the new space size |
120 // is 16 MB and it is full of wrappers (which is almost the worst case). | 120 // is 16 MB and it is full of wrappers (which is almost the worst case). |
121 // Practically speaking, as far as I crawled real web applications, | 121 // Practically speaking, as far as I crawled real web applications, |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
243 class MajorGCWrapperVisitor : public v8::PersistentHandleVisitor { | 243 class MajorGCWrapperVisitor : public v8::PersistentHandleVisitor { |
244 public: | 244 public: |
245 explicit MajorGCWrapperVisitor(v8::Isolate* isolate, bool constructRetainedO
bjectInfos) | 245 explicit MajorGCWrapperVisitor(v8::Isolate* isolate, bool constructRetainedO
bjectInfos) |
246 : m_isolate(isolate) | 246 : m_isolate(isolate) |
247 , m_domObjectsWithPendingActivity(0) | 247 , m_domObjectsWithPendingActivity(0) |
248 , m_liveRootGroupIdSet(false) | 248 , m_liveRootGroupIdSet(false) |
249 , m_constructRetainedObjectInfos(constructRetainedObjectInfos) | 249 , m_constructRetainedObjectInfos(constructRetainedObjectInfos) |
250 { | 250 { |
251 } | 251 } |
252 | 252 |
253 virtual void VisitPersistentHandle(v8::Persistent<v8::Value>* value, uint16_
t classId) override | 253 void VisitPersistentHandle(v8::Persistent<v8::Value>* value, uint16_t classI
d) override |
254 { | 254 { |
255 if (classId != WrapperTypeInfo::NodeClassId && classId != WrapperTypeInf
o::ObjectClassId) | 255 if (classId != WrapperTypeInfo::NodeClassId && classId != WrapperTypeInf
o::ObjectClassId) |
256 return; | 256 return; |
257 | 257 |
258 v8::Local<v8::Object> wrapper = v8::Local<v8::Object>::New(m_isolate, v8
::Persistent<v8::Object>::Cast(*value)); | 258 v8::Local<v8::Object> wrapper = v8::Local<v8::Object>::New(m_isolate, v8
::Persistent<v8::Object>::Cast(*value)); |
259 ASSERT(V8DOMWrapper::hasInternalFieldsSet(wrapper)); | 259 ASSERT(V8DOMWrapper::hasInternalFieldsSet(wrapper)); |
260 | 260 |
261 if (value->IsIndependent()) | 261 if (value->IsIndependent()) |
262 return; | 262 return; |
263 | 263 |
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
479 lastUsageReportedToV8 = currentUsage; | 479 lastUsageReportedToV8 = currentUsage; |
480 } | 480 } |
481 | 481 |
482 class DOMWrapperTracer : public v8::PersistentHandleVisitor { | 482 class DOMWrapperTracer : public v8::PersistentHandleVisitor { |
483 public: | 483 public: |
484 explicit DOMWrapperTracer(Visitor* visitor) | 484 explicit DOMWrapperTracer(Visitor* visitor) |
485 : m_visitor(visitor) | 485 : m_visitor(visitor) |
486 { | 486 { |
487 } | 487 } |
488 | 488 |
489 virtual void VisitPersistentHandle(v8::Persistent<v8::Value>* value, uint16_
t classId) override | 489 void VisitPersistentHandle(v8::Persistent<v8::Value>* value, uint16_t classI
d) override |
490 { | 490 { |
491 if (classId != WrapperTypeInfo::NodeClassId && classId != WrapperTypeInf
o::ObjectClassId) | 491 if (classId != WrapperTypeInfo::NodeClassId && classId != WrapperTypeInf
o::ObjectClassId) |
492 return; | 492 return; |
493 | 493 |
494 const v8::Persistent<v8::Object>& wrapper = v8::Persistent<v8::Object>::
Cast(*value); | 494 const v8::Persistent<v8::Object>& wrapper = v8::Persistent<v8::Object>::
Cast(*value); |
495 | 495 |
496 if (m_visitor) | 496 if (m_visitor) |
497 toWrapperTypeInfo(wrapper)->trace(m_visitor, toScriptWrappable(wrapp
er)); | 497 toWrapperTypeInfo(wrapper)->trace(m_visitor, toScriptWrappable(wrapp
er)); |
498 } | 498 } |
499 | 499 |
500 private: | 500 private: |
501 Visitor* m_visitor; | 501 Visitor* m_visitor; |
502 }; | 502 }; |
503 | 503 |
504 void V8GCController::traceDOMWrappers(v8::Isolate* isolate, Visitor* visitor) | 504 void V8GCController::traceDOMWrappers(v8::Isolate* isolate, Visitor* visitor) |
505 { | 505 { |
506 DOMWrapperTracer tracer(visitor); | 506 DOMWrapperTracer tracer(visitor); |
507 v8::V8::VisitHandlesWithClassIds(isolate, &tracer); | 507 v8::V8::VisitHandlesWithClassIds(isolate, &tracer); |
508 } | 508 } |
509 | 509 |
510 } // namespace blink | 510 } // namespace blink |
OLD | NEW |