| 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 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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, |
| 122 // the number of wrappers handled by each minor GC cycle is at most 3000
. | 122 // the number of wrappers handled by each minor GC cycle is at most 3000
. |
| 123 // So this limit is mainly for pathological micro benchmarks. | 123 // So this limit is mainly for pathological micro benchmarks. |
| 124 // |
| 125 // In Oilpan, we don't limit the number of wrappers to collect as many |
| 126 // wrappers in minor GC cycles as possible. This may increase the pause |
| 127 // time of a minor GC, but if we give up collecting wrappers in a minor |
| 128 // GC, it will instead end up with increasing the cost of subsequent |
| 129 // Oilpan's GCs. Thus it will be better to collect as many wrappers as |
| 130 // possible for minimizing the value of max(a pause time of a minor GC, |
| 131 // a pause time of Oilpan's GC). |
| 132 #if !ENABLE(OILPAN) |
| 124 const unsigned wrappersHandledByEachMinorGC = 10000; | 133 const unsigned wrappersHandledByEachMinorGC = 10000; |
| 125 if (m_nodesInNewSpace.size() >= wrappersHandledByEachMinorGC) | 134 if (m_nodesInNewSpace.size() >= wrappersHandledByEachMinorGC) |
| 126 return; | 135 return; |
| 136 #endif |
| 127 | 137 |
| 128 v8::Local<v8::Object> wrapper = v8::Local<v8::Object>::New(m_isolate, v8
::Persistent<v8::Object>::Cast(*value)); | 138 v8::Local<v8::Object> wrapper = v8::Local<v8::Object>::New(m_isolate, v8
::Persistent<v8::Object>::Cast(*value)); |
| 129 ASSERT(V8DOMWrapper::hasInternalFieldsSet(wrapper)); | 139 ASSERT(V8DOMWrapper::hasInternalFieldsSet(wrapper)); |
| 130 ASSERT(V8Node::hasInstance(wrapper, m_isolate)); | 140 ASSERT(V8Node::hasInstance(wrapper, m_isolate)); |
| 131 Node* node = V8Node::toImpl(wrapper); | 141 Node* node = V8Node::toImpl(wrapper); |
| 132 // A minor DOM GC can handle only node wrappers in the main world. | 142 // A minor DOM GC can handle only node wrappers in the main world. |
| 133 // Note that node->wrapper().IsEmpty() returns true for nodes that | 143 // Note that node->wrapper().IsEmpty() returns true for nodes that |
| 134 // do not have wrappers in the main world. | 144 // do not have wrappers in the main world. |
| 135 if (node->containsWrapper()) { | 145 if (node->containsWrapper()) { |
| 136 const WrapperTypeInfo* type = toWrapperTypeInfo(wrapper); | 146 const WrapperTypeInfo* type = toWrapperTypeInfo(wrapper); |
| (...skipping 396 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 533 Visitor* m_visitor; | 543 Visitor* m_visitor; |
| 534 }; | 544 }; |
| 535 | 545 |
| 536 void V8GCController::traceDOMWrappers(v8::Isolate* isolate, Visitor* visitor) | 546 void V8GCController::traceDOMWrappers(v8::Isolate* isolate, Visitor* visitor) |
| 537 { | 547 { |
| 538 DOMWrapperTracer tracer(visitor); | 548 DOMWrapperTracer tracer(visitor); |
| 539 v8::V8::VisitHandlesWithClassIds(isolate, &tracer); | 549 v8::V8::VisitHandlesWithClassIds(isolate, &tracer); |
| 540 } | 550 } |
| 541 | 551 |
| 542 } // namespace blink | 552 } // namespace blink |
| OLD | NEW |