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 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
128 | 128 |
129 if (classId == WrapperTypeInfo::NodeClassId) { | 129 if (classId == WrapperTypeInfo::NodeClassId) { |
130 ASSERT(V8Node::hasInstance(wrapper, m_isolate)); | 130 ASSERT(V8Node::hasInstance(wrapper, m_isolate)); |
131 Node* node = V8Node::toImpl(wrapper); | 131 Node* node = V8Node::toImpl(wrapper); |
132 if (node->hasEventListeners()) { | 132 if (node->hasEventListeners()) { |
133 v8::Persistent<v8::Object>::Cast(*value).MarkActive(); | 133 v8::Persistent<v8::Object>::Cast(*value).MarkActive(); |
134 return; | 134 return; |
135 } | 135 } |
136 // FIXME: Remove the special handling for SVG elements. | 136 // FIXME: Remove the special handling for SVG elements. |
137 // We currently can't collect SVG Elements from minor gc, as we have | 137 // We currently can't collect SVG Elements from minor gc, as we have |
138 // strong references from SVG property tear-offs keeping context SVG eleme
nt alive. | 138 // strong references from SVG property tear-offs keeping context SVG |
| 139 // element alive. |
139 if (node->isSVGElement()) { | 140 if (node->isSVGElement()) { |
140 v8::Persistent<v8::Object>::Cast(*value).MarkActive(); | 141 v8::Persistent<v8::Object>::Cast(*value).MarkActive(); |
141 return; | 142 return; |
142 } | 143 } |
143 } | 144 } |
144 } | 145 } |
145 | 146 |
146 private: | 147 private: |
147 v8::Isolate* m_isolate; | 148 v8::Isolate* m_isolate; |
148 }; | 149 }; |
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
391 blameContext->Leave(); | 392 blameContext->Leave(); |
392 | 393 |
393 ThreadState* currentThreadState = ThreadState::current(); | 394 ThreadState* currentThreadState = ThreadState::current(); |
394 if (currentThreadState && !currentThreadState->isGCForbidden()) { | 395 if (currentThreadState && !currentThreadState->isGCForbidden()) { |
395 // v8::kGCCallbackFlagForced forces a Blink heap garbage collection | 396 // v8::kGCCallbackFlagForced forces a Blink heap garbage collection |
396 // when a garbage collection was forced from V8. This is either used | 397 // when a garbage collection was forced from V8. This is either used |
397 // for tests that force GCs from JavaScript to verify that objects die | 398 // for tests that force GCs from JavaScript to verify that objects die |
398 // when expected. | 399 // when expected. |
399 if (flags & v8::kGCCallbackFlagForced) { | 400 if (flags & v8::kGCCallbackFlagForced) { |
400 // This single GC is not enough for two reasons: | 401 // This single GC is not enough for two reasons: |
401 // (1) The GC is not precise because the GC scans on-stack pointers cons
ervatively. | 402 // (1) The GC is not precise because the GC scans on-stack pointers |
402 // (2) One GC is not enough to break a chain of persistent handles. It's
possible that | 403 // conservatively. |
403 // some heap allocated objects own objects that contain persistent h
andles | 404 // (2) One GC is not enough to break a chain of persistent handles. It's |
404 // pointing to other heap allocated objects. To break the chain, we
need multiple GCs. | 405 // possible that some heap allocated objects own objects that |
| 406 // contain persistent handles pointing to other heap allocated |
| 407 // objects. To break the chain, we need multiple GCs. |
405 // | 408 // |
406 // Regarding (1), we force a precise GC at the end of the current event lo
op. So if you want | 409 // Regarding (1), we force a precise GC at the end of the current event |
407 // to collect all garbage, you need to wait until the next event loop. | 410 // loop. So if you want to collect all garbage, you need to wait until the |
408 // Regarding (2), it would be OK in practice to trigger only one GC per gc
Epilogue, because | 411 // next event loop. Regarding (2), it would be OK in practice to trigger |
409 // GCController.collectAll() forces multiple V8's GC. | 412 // only one GC per gcEpilogue, because GCController.collectAll() forces |
| 413 // multiple V8's GC. |
410 currentThreadState->collectGarbage(BlinkGC::HeapPointersOnStack, | 414 currentThreadState->collectGarbage(BlinkGC::HeapPointersOnStack, |
411 BlinkGC::GCWithSweep, | 415 BlinkGC::GCWithSweep, |
412 BlinkGC::ForcedGC); | 416 BlinkGC::ForcedGC); |
413 | 417 |
414 // Forces a precise GC at the end of the current event loop. | 418 // Forces a precise GC at the end of the current event loop. |
415 RELEASE_ASSERT(!currentThreadState->isInGC()); | 419 RELEASE_ASSERT(!currentThreadState->isInGC()); |
416 currentThreadState->setGCState(ThreadState::FullGCScheduled); | 420 currentThreadState->setGCState(ThreadState::FullGCScheduled); |
417 } | 421 } |
418 | 422 |
419 // v8::kGCCallbackFlagCollectAllAvailableGarbage is used when V8 handles | 423 // v8::kGCCallbackFlagCollectAllAvailableGarbage is used when V8 handles |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
533 double startTime = WTF::currentTimeMS(); | 537 double startTime = WTF::currentTimeMS(); |
534 v8::HandleScope scope(isolate); | 538 v8::HandleScope scope(isolate); |
535 PendingActivityVisitor visitor(isolate, executionContext); | 539 PendingActivityVisitor visitor(isolate, executionContext); |
536 toIsolate(executionContext)->VisitHandlesWithClassIds(&visitor); | 540 toIsolate(executionContext)->VisitHandlesWithClassIds(&visitor); |
537 scanPendingActivityHistogram.count( | 541 scanPendingActivityHistogram.count( |
538 static_cast<int>(WTF::currentTimeMS() - startTime)); | 542 static_cast<int>(WTF::currentTimeMS() - startTime)); |
539 return visitor.pendingActivityFound(); | 543 return visitor.pendingActivityFound(); |
540 } | 544 } |
541 | 545 |
542 } // namespace blink | 546 } // namespace blink |
OLD | NEW |