| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 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 286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 297 } | 297 } |
| 298 | 298 |
| 299 #if ENABLE(ASSERT) | 299 #if ENABLE(ASSERT) |
| 300 bool Heap::weakTableRegistered(const void* table) | 300 bool Heap::weakTableRegistered(const void* table) |
| 301 { | 301 { |
| 302 ASSERT(s_ephemeronStack); | 302 ASSERT(s_ephemeronStack); |
| 303 return s_ephemeronStack->hasCallbackForObject(table); | 303 return s_ephemeronStack->hasCallbackForObject(table); |
| 304 } | 304 } |
| 305 #endif | 305 #endif |
| 306 | 306 |
| 307 void Heap::decommitCallbackStacks() |
| 308 { |
| 309 s_markingStack->decommit(); |
| 310 s_postMarkingCallbackStack->decommit(); |
| 311 s_globalWeakCallbackStack->decommit(); |
| 312 s_ephemeronStack->decommit(); |
| 313 } |
| 314 |
| 307 void Heap::preGC() | 315 void Heap::preGC() |
| 308 { | 316 { |
| 309 ASSERT(!ThreadState::current()->isInGC()); | 317 ASSERT(!ThreadState::current()->isInGC()); |
| 310 for (ThreadState* state : ThreadState::attachedThreads()) | 318 for (ThreadState* state : ThreadState::attachedThreads()) |
| 311 state->preGC(); | 319 state->preGC(); |
| 312 } | 320 } |
| 313 | 321 |
| 314 void Heap::postGC(BlinkGC::GCType gcType) | 322 void Heap::postGC(BlinkGC::GCType gcType) |
| 315 { | 323 { |
| 316 ASSERT(ThreadState::current()->isInGC()); | 324 ASSERT(ThreadState::current()->isInGC()); |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 413 totalObjectSpaceHistogram.count(Heap::allocatedObjectSize() / 1024); | 421 totalObjectSpaceHistogram.count(Heap::allocatedObjectSize() / 1024); |
| 414 DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, totalAllocatedSpaceHis
togram, new CustomCountHistogram("BlinkGC.TotalAllocatedSpace", 0, 4 * 1024 * 10
24, 50)); | 422 DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, totalAllocatedSpaceHis
togram, new CustomCountHistogram("BlinkGC.TotalAllocatedSpace", 0, 4 * 1024 * 10
24, 50)); |
| 415 totalAllocatedSpaceHistogram.count(Heap::allocatedSpace() / 1024); | 423 totalAllocatedSpaceHistogram.count(Heap::allocatedSpace() / 1024); |
| 416 DEFINE_THREAD_SAFE_STATIC_LOCAL(EnumerationHistogram, gcReasonHistogram, new
EnumerationHistogram("BlinkGC.GCReason", BlinkGC::NumberOfGCReason)); | 424 DEFINE_THREAD_SAFE_STATIC_LOCAL(EnumerationHistogram, gcReasonHistogram, new
EnumerationHistogram("BlinkGC.GCReason", BlinkGC::NumberOfGCReason)); |
| 417 gcReasonHistogram.count(reason); | 425 gcReasonHistogram.count(reason); |
| 418 | 426 |
| 419 Heap::reportMemoryUsageHistogram(); | 427 Heap::reportMemoryUsageHistogram(); |
| 420 WTF::Partitions::reportMemoryUsageHistogram(); | 428 WTF::Partitions::reportMemoryUsageHistogram(); |
| 421 | 429 |
| 422 postGC(gcType); | 430 postGC(gcType); |
| 431 Heap::decommitCallbackStacks(); |
| 423 | 432 |
| 424 #if ENABLE(ASSERT) | 433 #if ENABLE(ASSERT) |
| 425 // 0 is used to figure non-assigned area, so avoid to use 0 in s_gcGeneratio
n. | 434 // 0 is used to figure non-assigned area, so avoid to use 0 in s_gcGeneratio
n. |
| 426 if (++s_gcGeneration == 0) { | 435 if (++s_gcGeneration == 0) { |
| 427 s_gcGeneration = 1; | 436 s_gcGeneration = 1; |
| 428 } | 437 } |
| 429 #endif | 438 #endif |
| 430 } | 439 } |
| 431 | 440 |
| 432 void Heap::collectGarbageForTerminatingThread(ThreadState* state) | 441 void Heap::collectGarbageForTerminatingThread(ThreadState* state) |
| (...skipping 22 matching lines...) Expand all Loading... |
| 455 state->visitPersistents(visitorScope.visitor()); | 464 state->visitPersistents(visitorScope.visitor()); |
| 456 | 465 |
| 457 // 2. Trace objects reachable from the thread's persistent roots | 466 // 2. Trace objects reachable from the thread's persistent roots |
| 458 // including ephemerons. | 467 // including ephemerons. |
| 459 processMarkingStack(visitorScope.visitor()); | 468 processMarkingStack(visitorScope.visitor()); |
| 460 | 469 |
| 461 postMarkingProcessing(visitorScope.visitor()); | 470 postMarkingProcessing(visitorScope.visitor()); |
| 462 globalWeakProcessing(visitorScope.visitor()); | 471 globalWeakProcessing(visitorScope.visitor()); |
| 463 | 472 |
| 464 state->postGC(BlinkGC::GCWithSweep); | 473 state->postGC(BlinkGC::GCWithSweep); |
| 474 Heap::decommitCallbackStacks(); |
| 465 } | 475 } |
| 466 state->preSweep(); | 476 state->preSweep(); |
| 467 } | 477 } |
| 468 | 478 |
| 469 void Heap::processMarkingStack(Visitor* visitor) | 479 void Heap::processMarkingStack(Visitor* visitor) |
| 470 { | 480 { |
| 471 // Ephemeron fixed point loop. | 481 // Ephemeron fixed point loop. |
| 472 do { | 482 do { |
| 473 { | 483 { |
| 474 // Iteratively mark all objects that are reachable from the objects | 484 // Iteratively mark all objects that are reachable from the objects |
| (...skipping 16 matching lines...) Expand all Loading... |
| 491 void Heap::postMarkingProcessing(Visitor* visitor) | 501 void Heap::postMarkingProcessing(Visitor* visitor) |
| 492 { | 502 { |
| 493 TRACE_EVENT0("blink_gc", "Heap::postMarkingProcessing"); | 503 TRACE_EVENT0("blink_gc", "Heap::postMarkingProcessing"); |
| 494 // Call post-marking callbacks including: | 504 // Call post-marking callbacks including: |
| 495 // 1. the ephemeronIterationDone callbacks on weak tables to do cleanup | 505 // 1. the ephemeronIterationDone callbacks on weak tables to do cleanup |
| 496 // (specifically to clear the queued bits for weak hash tables), and | 506 // (specifically to clear the queued bits for weak hash tables), and |
| 497 // 2. the markNoTracing callbacks on collection backings to mark them | 507 // 2. the markNoTracing callbacks on collection backings to mark them |
| 498 // if they are only reachable from their front objects. | 508 // if they are only reachable from their front objects. |
| 499 while (popAndInvokePostMarkingCallback(visitor)) { } | 509 while (popAndInvokePostMarkingCallback(visitor)) { } |
| 500 | 510 |
| 501 s_ephemeronStack->clear(); | |
| 502 | |
| 503 // Post-marking callbacks should not trace any objects and | 511 // Post-marking callbacks should not trace any objects and |
| 504 // therefore the marking stack should be empty after the | 512 // therefore the marking stack should be empty after the |
| 505 // post-marking callbacks. | 513 // post-marking callbacks. |
| 506 ASSERT(s_markingStack->isEmpty()); | 514 ASSERT(s_markingStack->isEmpty()); |
| 507 } | 515 } |
| 508 | 516 |
| 509 void Heap::globalWeakProcessing(Visitor* visitor) | 517 void Heap::globalWeakProcessing(Visitor* visitor) |
| 510 { | 518 { |
| 511 TRACE_EVENT0("blink_gc", "Heap::globalWeakProcessing"); | 519 TRACE_EVENT0("blink_gc", "Heap::globalWeakProcessing"); |
| 512 double startTime = WTF::currentTimeMS(); | 520 double startTime = WTF::currentTimeMS(); |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 677 size_t Heap::s_wrapperCountAtLastGC = 0; | 685 size_t Heap::s_wrapperCountAtLastGC = 0; |
| 678 size_t Heap::s_collectedWrapperCount = 0; | 686 size_t Heap::s_collectedWrapperCount = 0; |
| 679 size_t Heap::s_partitionAllocSizeAtLastGC = 0; | 687 size_t Heap::s_partitionAllocSizeAtLastGC = 0; |
| 680 double Heap::s_estimatedMarkingTimePerByte = 0.0; | 688 double Heap::s_estimatedMarkingTimePerByte = 0.0; |
| 681 bool Heap::s_isLowEndDevice = false; | 689 bool Heap::s_isLowEndDevice = false; |
| 682 #if ENABLE(ASSERT) | 690 #if ENABLE(ASSERT) |
| 683 uint16_t Heap::s_gcGeneration = 0; | 691 uint16_t Heap::s_gcGeneration = 0; |
| 684 #endif | 692 #endif |
| 685 | 693 |
| 686 } // namespace blink | 694 } // namespace blink |
| OLD | NEW |