| 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 707 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 718 | 718 | 
| 719 #define UNEXPECTED_GCSTATE(s) case ThreadState::s: RELEASE_ASSERT_WITH_MESSAGE(f
      alse, "Unexpected transition while in GCState " #s); return | 719 #define UNEXPECTED_GCSTATE(s) case ThreadState::s: RELEASE_ASSERT_WITH_MESSAGE(f
      alse, "Unexpected transition while in GCState " #s); return | 
| 720 | 720 | 
| 721 void unexpectedGCState(ThreadState::GCState gcState) | 721 void unexpectedGCState(ThreadState::GCState gcState) | 
| 722 { | 722 { | 
| 723     switch (gcState) { | 723     switch (gcState) { | 
| 724         UNEXPECTED_GCSTATE(NoGCScheduled); | 724         UNEXPECTED_GCSTATE(NoGCScheduled); | 
| 725         UNEXPECTED_GCSTATE(IdleGCScheduled); | 725         UNEXPECTED_GCSTATE(IdleGCScheduled); | 
| 726         UNEXPECTED_GCSTATE(PreciseGCScheduled); | 726         UNEXPECTED_GCSTATE(PreciseGCScheduled); | 
| 727         UNEXPECTED_GCSTATE(FullGCScheduled); | 727         UNEXPECTED_GCSTATE(FullGCScheduled); | 
| 728         UNEXPECTED_GCSTATE(StoppingOtherThreads); |  | 
| 729         UNEXPECTED_GCSTATE(GCRunning); | 728         UNEXPECTED_GCSTATE(GCRunning); | 
| 730         UNEXPECTED_GCSTATE(EagerSweepScheduled); | 729         UNEXPECTED_GCSTATE(EagerSweepScheduled); | 
| 731         UNEXPECTED_GCSTATE(LazySweepScheduled); | 730         UNEXPECTED_GCSTATE(LazySweepScheduled); | 
| 732         UNEXPECTED_GCSTATE(Sweeping); | 731         UNEXPECTED_GCSTATE(Sweeping); | 
| 733         UNEXPECTED_GCSTATE(SweepingAndIdleGCScheduled); | 732         UNEXPECTED_GCSTATE(SweepingAndIdleGCScheduled); | 
| 734         UNEXPECTED_GCSTATE(SweepingAndPreciseGCScheduled); | 733         UNEXPECTED_GCSTATE(SweepingAndPreciseGCScheduled); | 
| 735     default: | 734     default: | 
| 736         ASSERT_NOT_REACHED(); | 735         ASSERT_NOT_REACHED(); | 
| 737         return; | 736         return; | 
| 738     } | 737     } | 
| 739 } | 738 } | 
| 740 | 739 | 
| 741 #undef UNEXPECTED_GCSTATE | 740 #undef UNEXPECTED_GCSTATE | 
| 742 | 741 | 
| 743 } // namespace | 742 } // namespace | 
| 744 | 743 | 
| 745 #define VERIFY_STATE_TRANSITION(condition) if (UNLIKELY(!(condition))) unexpecte
      dGCState(m_gcState) | 744 #define VERIFY_STATE_TRANSITION(condition) if (UNLIKELY(!(condition))) unexpecte
      dGCState(m_gcState) | 
| 746 | 745 | 
| 747 void ThreadState::setGCState(GCState gcState) | 746 void ThreadState::setGCState(GCState gcState) | 
| 748 { | 747 { | 
| 749     switch (gcState) { | 748     switch (gcState) { | 
| 750     case NoGCScheduled: | 749     case NoGCScheduled: | 
| 751         checkThread(); | 750         checkThread(); | 
| 752         VERIFY_STATE_TRANSITION(m_gcState == StoppingOtherThreads || m_gcState =
      = Sweeping || m_gcState == SweepingAndIdleGCScheduled); | 751         VERIFY_STATE_TRANSITION(m_gcState == Sweeping || m_gcState == SweepingAn
      dIdleGCScheduled); | 
| 753         break; | 752         break; | 
| 754     case IdleGCScheduled: | 753     case IdleGCScheduled: | 
| 755     case PreciseGCScheduled: | 754     case PreciseGCScheduled: | 
| 756     case FullGCScheduled: | 755     case FullGCScheduled: | 
| 757         checkThread(); | 756         checkThread(); | 
| 758         VERIFY_STATE_TRANSITION(m_gcState == NoGCScheduled || m_gcState == IdleG
      CScheduled || m_gcState == PreciseGCScheduled || m_gcState == FullGCScheduled ||
       m_gcState == StoppingOtherThreads || m_gcState == SweepingAndIdleGCScheduled ||
       m_gcState == SweepingAndPreciseGCScheduled); | 757         VERIFY_STATE_TRANSITION(m_gcState == NoGCScheduled || m_gcState == IdleG
      CScheduled || m_gcState == PreciseGCScheduled || m_gcState == FullGCScheduled ||
       m_gcState == SweepingAndIdleGCScheduled || m_gcState == SweepingAndPreciseGCSch
      eduled); | 
| 759         completeSweep(); | 758         completeSweep(); | 
| 760         break; | 759         break; | 
| 761     case StoppingOtherThreads: |  | 
| 762         checkThread(); |  | 
| 763         VERIFY_STATE_TRANSITION(m_gcState == NoGCScheduled || m_gcState == IdleG
      CScheduled || m_gcState == PreciseGCScheduled || m_gcState == FullGCScheduled ||
       m_gcState == Sweeping || m_gcState == SweepingAndIdleGCScheduled || m_gcState =
      = SweepingAndPreciseGCScheduled); |  | 
| 764         break; |  | 
| 765     case GCRunning: | 760     case GCRunning: | 
| 766         ASSERT(!isInGC()); | 761         ASSERT(!isInGC()); | 
| 767         VERIFY_STATE_TRANSITION(m_gcState != GCRunning); | 762         VERIFY_STATE_TRANSITION(m_gcState != GCRunning); | 
| 768         break; | 763         break; | 
| 769     case EagerSweepScheduled: | 764     case EagerSweepScheduled: | 
| 770     case LazySweepScheduled: | 765     case LazySweepScheduled: | 
| 771         ASSERT(isInGC()); | 766         ASSERT(isInGC()); | 
| 772         VERIFY_STATE_TRANSITION(m_gcState == GCRunning); | 767         VERIFY_STATE_TRANSITION(m_gcState == GCRunning); | 
| 773         break; | 768         break; | 
| 774     case Sweeping: | 769     case Sweeping: | 
| 775         checkThread(); | 770         checkThread(); | 
| 776         VERIFY_STATE_TRANSITION(m_gcState == StoppingOtherThreads || m_gcState =
      = EagerSweepScheduled || m_gcState == LazySweepScheduled); | 771         VERIFY_STATE_TRANSITION(m_gcState == EagerSweepScheduled || m_gcState ==
       LazySweepScheduled); | 
| 777         break; | 772         break; | 
| 778     case SweepingAndIdleGCScheduled: | 773     case SweepingAndIdleGCScheduled: | 
| 779     case SweepingAndPreciseGCScheduled: | 774     case SweepingAndPreciseGCScheduled: | 
| 780         checkThread(); | 775         checkThread(); | 
| 781         VERIFY_STATE_TRANSITION(m_gcState == StoppingOtherThreads || m_gcState =
      = Sweeping || m_gcState == SweepingAndIdleGCScheduled || m_gcState == SweepingAn
      dPreciseGCScheduled); | 776         VERIFY_STATE_TRANSITION(m_gcState == Sweeping || m_gcState == SweepingAn
      dIdleGCScheduled || m_gcState == SweepingAndPreciseGCScheduled); | 
| 782         break; | 777         break; | 
| 783     default: | 778     default: | 
| 784         ASSERT_NOT_REACHED(); | 779         ASSERT_NOT_REACHED(); | 
| 785     } | 780     } | 
| 786     m_gcState = gcState; | 781     m_gcState = gcState; | 
| 787 } | 782 } | 
| 788 | 783 | 
| 789 #undef VERIFY_STATE_TRANSITION | 784 #undef VERIFY_STATE_TRANSITION | 
| 790 | 785 | 
| 791 ThreadState::GCState ThreadState::gcState() const | 786 ThreadState::GCState ThreadState::gcState() const | 
| (...skipping 11 matching lines...) Expand all  Loading... | 
| 803         Heap::setEstimatedLiveObjectSize(Heap::estimatedLiveObjectSize() / 2); | 798         Heap::setEstimatedLiveObjectSize(Heap::estimatedLiveObjectSize() / 2); | 
| 804     } | 799     } | 
| 805 } | 800 } | 
| 806 | 801 | 
| 807 void ThreadState::runScheduledGC(StackState stackState) | 802 void ThreadState::runScheduledGC(StackState stackState) | 
| 808 { | 803 { | 
| 809     checkThread(); | 804     checkThread(); | 
| 810     if (stackState != NoHeapPointersOnStack) | 805     if (stackState != NoHeapPointersOnStack) | 
| 811         return; | 806         return; | 
| 812 | 807 | 
|  | 808     // If a safe point is entered while initiating a GC, we clearly do | 
|  | 809     // not want to do another as part that -- the safe point is only | 
|  | 810     // entered after checking if a scheduled GC ought to run first. | 
|  | 811     // Prevent that from happening by marking GCs as forbidden while | 
|  | 812     // one is initiated and later running. | 
|  | 813     if (isGCForbidden()) | 
|  | 814         return; | 
|  | 815 | 
| 813     switch (gcState()) { | 816     switch (gcState()) { | 
| 814     case FullGCScheduled: | 817     case FullGCScheduled: | 
| 815         Heap::collectAllGarbage(); | 818         Heap::collectAllGarbage(); | 
| 816         break; | 819         break; | 
| 817     case PreciseGCScheduled: | 820     case PreciseGCScheduled: | 
| 818         Heap::collectGarbage(NoHeapPointersOnStack, GCWithoutSweep, Heap::Precis
      eGC); | 821         Heap::collectGarbage(NoHeapPointersOnStack, GCWithoutSweep, Heap::Precis
      eGC); | 
| 819         break; | 822         break; | 
| 820     case IdleGCScheduled: | 823     case IdleGCScheduled: | 
| 821         // Idle time GC will be scheduled by Blink Scheduler. | 824         // Idle time GC will be scheduled by Blink Scheduler. | 
| 822         break; | 825         break; | 
| (...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1100 #endif | 1103 #endif | 
| 1101 | 1104 | 
| 1102 void ThreadState::enterSafePoint(StackState stackState, void* scopeMarker) | 1105 void ThreadState::enterSafePoint(StackState stackState, void* scopeMarker) | 
| 1103 { | 1106 { | 
| 1104     checkThread(); | 1107     checkThread(); | 
| 1105 #ifdef ADDRESS_SANITIZER | 1108 #ifdef ADDRESS_SANITIZER | 
| 1106     if (stackState == HeapPointersOnStack) | 1109     if (stackState == HeapPointersOnStack) | 
| 1107         scopeMarker = adjustScopeMarkerForAdressSanitizer(scopeMarker); | 1110         scopeMarker = adjustScopeMarkerForAdressSanitizer(scopeMarker); | 
| 1108 #endif | 1111 #endif | 
| 1109     ASSERT(stackState == NoHeapPointersOnStack || scopeMarker); | 1112     ASSERT(stackState == NoHeapPointersOnStack || scopeMarker); | 
| 1110     ASSERT(!isGCForbidden()); |  | 
| 1111     runScheduledGC(stackState); | 1113     runScheduledGC(stackState); | 
| 1112     ASSERT(!m_atSafePoint); | 1114     ASSERT(!m_atSafePoint); | 
| 1113     m_atSafePoint = true; | 1115     m_atSafePoint = true; | 
| 1114     m_stackState = stackState; | 1116     m_stackState = stackState; | 
| 1115     m_safePointScopeMarker = scopeMarker; | 1117     m_safePointScopeMarker = scopeMarker; | 
| 1116     s_safePointBarrier->enterSafePoint(this); | 1118     s_safePointBarrier->enterSafePoint(this); | 
| 1117 } | 1119 } | 
| 1118 | 1120 | 
| 1119 void ThreadState::leaveSafePoint(SafePointAwareMutexLocker* locker) | 1121 void ThreadState::leaveSafePoint(SafePointAwareMutexLocker* locker) | 
| 1120 { | 1122 { | 
| (...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1349         json->beginArray(it->key.ascii().data()); | 1351         json->beginArray(it->key.ascii().data()); | 
| 1350         for (size_t age = 0; age <= maxHeapObjectAge; ++age) | 1352         for (size_t age = 0; age <= maxHeapObjectAge; ++age) | 
| 1351             json->pushInteger(it->value.ages[age]); | 1353             json->pushInteger(it->value.ages[age]); | 
| 1352         json->endArray(); | 1354         json->endArray(); | 
| 1353     } | 1355     } | 
| 1354     TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID(TRACE_DISABLED_BY_DEFAULT("blink_gc"), s
      tatsName, this, json.release()); | 1356     TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID(TRACE_DISABLED_BY_DEFAULT("blink_gc"), s
      tatsName, this, json.release()); | 
| 1355 } | 1357 } | 
| 1356 #endif | 1358 #endif | 
| 1357 | 1359 | 
| 1358 } // namespace blink | 1360 } // namespace blink | 
| OLD | NEW | 
|---|