Changeset 161429 in webkit


Ignore:
Timestamp:
Jan 7, 2014 9:39:52 AM (10 years ago)
Author:
mhahnenberg@apple.com
Message:

Heap::collect shouldn't be responsible for sweeping
https://bugs.webkit.org/show_bug.cgi?id=126556

Reviewed by Geoffrey Garen.

Sweeping happens at an awkward time during collection due to the fact that destructors can
cause arbitrary reentry into the VM. This patch separates collecting and sweeping, and delays
sweeping until after collection has completely finished.

  • heap/Heap.cpp:

(JSC::Heap::collectAllGarbage):
(JSC::Heap::collect):
(JSC::Heap::collectIfNecessaryOrDefer):

  • heap/Heap.h:
  • heap/MarkedSpace.cpp:

(JSC::MarkedSpace::sweep):

  • runtime/GCActivityCallback.cpp:

(JSC::DefaultGCActivityCallback::doWork):

Location:
trunk/Source/JavaScriptCore
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r161414 r161429  
     12014-01-06  Mark Hahnenberg  <mhahnenberg@apple.com>
     2
     3        Heap::collect shouldn't be responsible for sweeping
     4        https://bugs.webkit.org/show_bug.cgi?id=126556
     5
     6        Reviewed by Geoffrey Garen.
     7
     8        Sweeping happens at an awkward time during collection due to the fact that destructors can
     9        cause arbitrary reentry into the VM. This patch separates collecting and sweeping, and delays
     10        sweeping until after collection has completely finished.
     11
     12        * heap/Heap.cpp:
     13        (JSC::Heap::collectAllGarbage):
     14        (JSC::Heap::collect):
     15        (JSC::Heap::collectIfNecessaryOrDefer):
     16        * heap/Heap.h:
     17        * heap/MarkedSpace.cpp:
     18        (JSC::MarkedSpace::sweep):
     19        * runtime/GCActivityCallback.cpp:
     20        (JSC::DefaultGCActivityCallback::doWork):
     21
    1222014-01-07  Mark Rowe  <mrowe@apple.com>
    223
  • trunk/Source/JavaScriptCore/heap/Heap.cpp

    r161240 r161429  
    728728    if (!m_isSafeToCollect)
    729729        return;
    730    
     730
     731    collect();
     732
     733    SamplingRegion samplingRegion("Garbage Collection: Sweeping");
    731734    DelayedReleaseScope delayedReleaseScope(m_objectSpace);
    732     collect(DoSweep);
     735    m_objectSpace.sweep();
     736    m_objectSpace.shrink();
    733737}
    734738
    735739static double minute = 60.0;
    736740
    737 void Heap::collect(SweepToggle sweepToggle)
     741void Heap::collect()
    738742{
    739743#if ENABLE(ALLOCATION_LOGGING)
     
    743747    double before = 0;
    744748    if (Options::logGC()) {
    745         dataLog("[GC", sweepToggle == DoSweep ? " (eager sweep)" : "", ": ");
     749        dataLog("[GC: ");
    746750        before = currentTimeMS();
    747751    }
     
    816820    }
    817821
    818     if (sweepToggle == DoSweep) {
    819         SamplingRegion samplingRegion("Garbage Collection: Sweeping");
    820         GCPHASE(Sweeping);
    821         m_objectSpace.sweep();
    822         m_objectSpace.shrink();
    823     }
    824 
    825822    m_sweeper->startSweeping(m_blockSnapshot);
    826823    m_bytesAbandoned = 0;
     
    881878        return false;
    882879   
    883     collect(DoNotSweep);
     880    collect();
    884881    return true;
    885882}
  • trunk/Source/JavaScriptCore/heap/Heap.h

    r161240 r161429  
    140140
    141141        JS_EXPORT_PRIVATE void collectAllGarbage();
    142         enum SweepToggle { DoNotSweep, DoSweep };
    143142        bool shouldCollect();
    144         void collect(SweepToggle);
     143        void collect();
    145144        bool collectIfNecessaryOrDefer(); // Returns true if it did collect.
    146145
  • trunk/Source/JavaScriptCore/heap/MarkedSpace.cpp

    r159515 r161429  
    121121void MarkedSpace::sweep()
    122122{
     123    if (Options::logGC())
     124        dataLog("Eagerly sweeping...");
    123125    m_heap->sweeper()->willFinishSweeping();
    124126    forEachBlock<Sweep>();
  • trunk/Source/JavaScriptCore/runtime/GCActivityCallback.cpp

    r157537 r161429  
    9696    }
    9797#endif
    98     heap->collect(Heap::DoNotSweep);
     98    heap->collect();
    9999}
    100100   
Note: See TracChangeset for help on using the changeset viewer.