Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(200)

Side by Side Diff: Source/platform/heap/ThreadState.cpp

Issue 1145423009: Oilpan: simplify away StoppingOtherThreads pseudo GCState. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: rebased and adjusted Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
OLDNEW
« Source/platform/heap/SafePoint.h ('K') | « Source/platform/heap/ThreadState.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698