| 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 337 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 348 } | 348 } |
| 349 | 349 |
| 350 #if ENABLE(ASSERT) | 350 #if ENABLE(ASSERT) |
| 351 bool Heap::weakTableRegistered(const void* table) | 351 bool Heap::weakTableRegistered(const void* table) |
| 352 { | 352 { |
| 353 ASSERT(s_ephemeronStack); | 353 ASSERT(s_ephemeronStack); |
| 354 return s_ephemeronStack->hasCallbackForObject(table); | 354 return s_ephemeronStack->hasCallbackForObject(table); |
| 355 } | 355 } |
| 356 #endif | 356 #endif |
| 357 | 357 |
| 358 void Heap::decommitCallbackStacks() | |
| 359 { | |
| 360 s_markingStack->decommit(); | |
| 361 s_postMarkingCallbackStack->decommit(); | |
| 362 s_globalWeakCallbackStack->decommit(); | |
| 363 s_ephemeronStack->decommit(); | |
| 364 } | |
| 365 | |
| 366 void Heap::preGC() | 358 void Heap::preGC() |
| 367 { | 359 { |
| 368 ASSERT(!ThreadState::current()->isInGC()); | 360 ASSERT(!ThreadState::current()->isInGC()); |
| 369 for (ThreadState* state : ThreadState::attachedThreads()) | 361 for (ThreadState* state : ThreadState::attachedThreads()) |
| 370 state->preGC(); | 362 state->preGC(); |
| 371 } | 363 } |
| 372 | 364 |
| 373 void Heap::postGC(BlinkGC::GCType gcType) | 365 void Heap::postGC(BlinkGC::GCType gcType) |
| 374 { | 366 { |
| 375 ASSERT(ThreadState::current()->isInGC()); | 367 ASSERT(ThreadState::current()->isInGC()); |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 470 totalObjectSpaceHistogram.count(Heap::allocatedObjectSize() / 1024); | 462 totalObjectSpaceHistogram.count(Heap::allocatedObjectSize() / 1024); |
| 471 DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, totalAllocatedSpaceHis
togram, new CustomCountHistogram("BlinkGC.TotalAllocatedSpace", 0, 4 * 1024 * 10
24, 50)); | 463 DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, totalAllocatedSpaceHis
togram, new CustomCountHistogram("BlinkGC.TotalAllocatedSpace", 0, 4 * 1024 * 10
24, 50)); |
| 472 totalAllocatedSpaceHistogram.count(Heap::allocatedSpace() / 1024); | 464 totalAllocatedSpaceHistogram.count(Heap::allocatedSpace() / 1024); |
| 473 DEFINE_THREAD_SAFE_STATIC_LOCAL(EnumerationHistogram, gcReasonHistogram, new
EnumerationHistogram("BlinkGC.GCReason", BlinkGC::NumberOfGCReason)); | 465 DEFINE_THREAD_SAFE_STATIC_LOCAL(EnumerationHistogram, gcReasonHistogram, new
EnumerationHistogram("BlinkGC.GCReason", BlinkGC::NumberOfGCReason)); |
| 474 gcReasonHistogram.count(reason); | 466 gcReasonHistogram.count(reason); |
| 475 | 467 |
| 476 Heap::reportMemoryUsageHistogram(); | 468 Heap::reportMemoryUsageHistogram(); |
| 477 WTF::Partitions::reportMemoryUsageHistogram(); | 469 WTF::Partitions::reportMemoryUsageHistogram(); |
| 478 | 470 |
| 479 postGC(gcType); | 471 postGC(gcType); |
| 480 Heap::decommitCallbackStacks(); | |
| 481 | 472 |
| 482 #if ENABLE(ASSERT) | 473 #if ENABLE(ASSERT) |
| 483 // 0 is used to figure non-assigned area, so avoid to use 0 in s_gcGeneratio
n. | 474 // 0 is used to figure non-assigned area, so avoid to use 0 in s_gcGeneratio
n. |
| 484 if (++s_gcGeneration == 0) { | 475 if (++s_gcGeneration == 0) { |
| 485 s_gcGeneration = 1; | 476 s_gcGeneration = 1; |
| 486 } | 477 } |
| 487 #endif | 478 #endif |
| 488 } | 479 } |
| 489 | 480 |
| 490 void Heap::collectGarbageForTerminatingThread(ThreadState* state) | 481 void Heap::collectGarbageForTerminatingThread(ThreadState* state) |
| (...skipping 22 matching lines...) Expand all Loading... |
| 513 state->visitPersistents(gcScope.visitor()); | 504 state->visitPersistents(gcScope.visitor()); |
| 514 | 505 |
| 515 // 2. Trace objects reachable from the thread's persistent roots | 506 // 2. Trace objects reachable from the thread's persistent roots |
| 516 // including ephemerons. | 507 // including ephemerons. |
| 517 processMarkingStack(gcScope.visitor()); | 508 processMarkingStack(gcScope.visitor()); |
| 518 | 509 |
| 519 postMarkingProcessing(gcScope.visitor()); | 510 postMarkingProcessing(gcScope.visitor()); |
| 520 globalWeakProcessing(gcScope.visitor()); | 511 globalWeakProcessing(gcScope.visitor()); |
| 521 | 512 |
| 522 state->postGC(BlinkGC::GCWithSweep); | 513 state->postGC(BlinkGC::GCWithSweep); |
| 523 Heap::decommitCallbackStacks(); | |
| 524 } | 514 } |
| 525 state->preSweep(); | 515 state->preSweep(); |
| 526 } | 516 } |
| 527 | 517 |
| 528 void Heap::processMarkingStack(Visitor* visitor) | 518 void Heap::processMarkingStack(Visitor* visitor) |
| 529 { | 519 { |
| 530 // Ephemeron fixed point loop. | 520 // Ephemeron fixed point loop. |
| 531 do { | 521 do { |
| 532 { | 522 { |
| 533 // Iteratively mark all objects that are reachable from the objects | 523 // Iteratively mark all objects that are reachable from the objects |
| (...skipping 16 matching lines...) Expand all Loading... |
| 550 void Heap::postMarkingProcessing(Visitor* visitor) | 540 void Heap::postMarkingProcessing(Visitor* visitor) |
| 551 { | 541 { |
| 552 TRACE_EVENT0("blink_gc", "Heap::postMarkingProcessing"); | 542 TRACE_EVENT0("blink_gc", "Heap::postMarkingProcessing"); |
| 553 // Call post-marking callbacks including: | 543 // Call post-marking callbacks including: |
| 554 // 1. the ephemeronIterationDone callbacks on weak tables to do cleanup | 544 // 1. the ephemeronIterationDone callbacks on weak tables to do cleanup |
| 555 // (specifically to clear the queued bits for weak hash tables), and | 545 // (specifically to clear the queued bits for weak hash tables), and |
| 556 // 2. the markNoTracing callbacks on collection backings to mark them | 546 // 2. the markNoTracing callbacks on collection backings to mark them |
| 557 // if they are only reachable from their front objects. | 547 // if they are only reachable from their front objects. |
| 558 while (popAndInvokePostMarkingCallback(visitor)) { } | 548 while (popAndInvokePostMarkingCallback(visitor)) { } |
| 559 | 549 |
| 550 s_ephemeronStack->clear(); |
| 551 |
| 560 // Post-marking callbacks should not trace any objects and | 552 // Post-marking callbacks should not trace any objects and |
| 561 // therefore the marking stack should be empty after the | 553 // therefore the marking stack should be empty after the |
| 562 // post-marking callbacks. | 554 // post-marking callbacks. |
| 563 ASSERT(s_markingStack->isEmpty()); | 555 ASSERT(s_markingStack->isEmpty()); |
| 564 } | 556 } |
| 565 | 557 |
| 566 void Heap::globalWeakProcessing(Visitor* visitor) | 558 void Heap::globalWeakProcessing(Visitor* visitor) |
| 567 { | 559 { |
| 568 TRACE_EVENT0("blink_gc", "Heap::globalWeakProcessing"); | 560 TRACE_EVENT0("blink_gc", "Heap::globalWeakProcessing"); |
| 569 double startTime = WTF::currentTimeMS(); | 561 double startTime = WTF::currentTimeMS(); |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 734 size_t Heap::s_wrapperCountAtLastGC = 0; | 726 size_t Heap::s_wrapperCountAtLastGC = 0; |
| 735 size_t Heap::s_collectedWrapperCount = 0; | 727 size_t Heap::s_collectedWrapperCount = 0; |
| 736 size_t Heap::s_partitionAllocSizeAtLastGC = 0; | 728 size_t Heap::s_partitionAllocSizeAtLastGC = 0; |
| 737 double Heap::s_estimatedMarkingTimePerByte = 0.0; | 729 double Heap::s_estimatedMarkingTimePerByte = 0.0; |
| 738 bool Heap::s_isLowEndDevice = false; | 730 bool Heap::s_isLowEndDevice = false; |
| 739 #if ENABLE(ASSERT) | 731 #if ENABLE(ASSERT) |
| 740 uint16_t Heap::s_gcGeneration = 0; | 732 uint16_t Heap::s_gcGeneration = 0; |
| 741 #endif | 733 #endif |
| 742 | 734 |
| 743 } // namespace blink | 735 } // namespace blink |
| OLD | NEW |