Ignore:
Timestamp:
Jun 6, 2012, 4:11:09 PM (13 years ago)
Author:
[email protected]
Message:

ENH: Add Logging to GC Marking Phase
https://bugs.webkit.org/show_bug.cgi?id=88364

Reviewed by Filip Pizlo.

Source/JavaScriptCore:

Log GC marking to stderr or a file. The logging in controlled
with the define ENABLE_OBJECT_MARK_LOGGING in wtf/Platform.h.
If DATA_LOG_TO_FILE in wtf/DataLog.cpp is set to 1, output is
logged to a file otherwise it is logged to stderr.

When logging is enabled, the GC is built single threaded since the
log output from the various threads isn't buffered and output in a
thread safe manner.

  • heap/Heap.cpp:

(JSC::Heap::markRoots):

  • heap/MarkStack.cpp:

(JSC::MarkStackThreadSharedData::resetChildren):
(JSC::MarkStackThreadSharedData::childVisitCount):
(JSC::MarkStackThreadSharedData::markingThreadMain):
(JSC::MarkStackThreadSharedData::markingThreadStartFunc):
(JSC::MarkStackThreadSharedData::MarkStackThreadSharedData):
(JSC::MarkStackThreadSharedData::reset):

  • heap/MarkStack.h:

(MarkStackThreadSharedData):
(MarkStack):
(JSC::MarkStack::sharedData):
(JSC::MarkStack::resetChildCount):
(JSC::MarkStack::childCount):
(JSC::MarkStack::incrementChildCount):

  • runtime/JSArray.cpp:

(JSC::JSArray::visitChildren):

  • runtime/JSCell.cpp:

(JSC::JSCell::className):

  • runtime/JSCell.h:

(JSCell):
(JSC::JSCell::visitChildren):

  • runtime/JSString.cpp:

(JSC::JSString::visitChildren):

  • runtime/JSString.h:

(JSString):

  • runtime/Structure.h:

(JSC::MarkStack::internalAppend):

Source/WTF:

  • wtf/DataLog.cpp:

(WTF::dataLogString): Additional method to support GC Mark logging.

  • wtf/DataLog.h:
  • wtf/Platform.h: New ENABLE_OBJECT_MARK_LOGGING flag macro.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/heap/Heap.cpp

    r119518 r119633  
    422422    ASSERT(isValidThreadState(m_globalData));
    423423
     424#if ENABLE(OBJECT_MARK_LOGGING)
     425    double gcStartTime = WTF::currentTime();
     426#endif
     427
    424428    void* dummy;
    425429   
     
    485489        {
    486490            GCPHASE(VisitMachineRoots);
     491            MARK_LOG_ROOT(visitor, "C++ Stack");
    487492            visitor.append(machineThreadRoots);
    488493            visitor.donateAndDrain();
     
    490495        {
    491496            GCPHASE(VisitRegisterFileRoots);
     497            MARK_LOG_ROOT(visitor, "Register File");
    492498            visitor.append(registerFileRoots);
    493499            visitor.donateAndDrain();
     
    496502        {
    497503            GCPHASE(VisitScratchBufferRoots);
     504            MARK_LOG_ROOT(visitor, "Scratch Buffers");
    498505            visitor.append(scratchBufferRoots);
    499506            visitor.donateAndDrain();
     
    502509        {
    503510            GCPHASE(VisitProtectedObjects);
     511            MARK_LOG_ROOT(visitor, "Protected Objects");
    504512            markProtectedObjects(heapRootVisitor);
    505513            visitor.donateAndDrain();
     
    507515        {
    508516            GCPHASE(VisitTempSortVectors);
     517            MARK_LOG_ROOT(visitor, "Temp Sort Vectors");
    509518            markTempSortVectors(heapRootVisitor);
    510519            visitor.donateAndDrain();
     
    514523            GCPHASE(MarkingArgumentBuffers);
    515524            if (m_markListSet && m_markListSet->size()) {
     525                MARK_LOG_ROOT(visitor, "Argument Buffers");
    516526                MarkedArgumentBuffer::markLists(heapRootVisitor, *m_markListSet);
    517527                visitor.donateAndDrain();
     
    520530        if (m_globalData->exception) {
    521531            GCPHASE(MarkingException);
     532            MARK_LOG_ROOT(visitor, "Exceptions");
    522533            heapRootVisitor.visit(&m_globalData->exception);
    523534            visitor.donateAndDrain();
     
    526537        {
    527538            GCPHASE(VisitStrongHandles);
     539            MARK_LOG_ROOT(visitor, "Strong Handles");
    528540            m_handleSet.visitStrongHandles(heapRootVisitor);
    529541            visitor.donateAndDrain();
     
    532544        {
    533545            GCPHASE(HandleStack);
     546            MARK_LOG_ROOT(visitor, "Handle Stack");
    534547            m_handleStack.visit(heapRootVisitor);
    535548            visitor.donateAndDrain();
     
    538551        {
    539552            GCPHASE(TraceCodeBlocks);
     553            MARK_LOG_ROOT(visitor, "Trace Code Blocks");
    540554            m_dfgCodeBlocks.traceMarkedCodeBlocks(visitor);
    541555            visitor.donateAndDrain();
     
    554568    {
    555569        GCPHASE(VisitingLiveWeakHandles);
     570        MARK_LOG_ROOT(visitor, "Live Weak Handles");
    556571        while (true) {
    557572            m_objectSpace.visitWeakSets(heapRootVisitor);
     
    572587
    573588    visitor.doneCopying();
     589#if ENABLE(OBJECT_MARK_LOGGING)
     590    size_t visitCount = visitor.visitCount();
     591#if ENABLE(PARALLEL_GC)
     592    visitCount += m_sharedData.childVisitCount();
     593#endif
     594    MARK_LOG_MESSAGE2("\nNumber of live Objects after full GC %lu, took %.6f secs\n", visitCount, WTF::currentTime() - gcStartTime);
     595#endif
     596
    574597    visitor.reset();
    575598    m_sharedData.reset();
     599#if ENABLE(PARALLEL_GC)
     600    m_sharedData.resetChildren();
     601#endif
    576602    m_storageSpace.doneCopying();
    577603
Note: See TracChangeset for help on using the changeset viewer.