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/MarkStack.cpp

    r117013 r119633  
    3737#include "ScopeChain.h"
    3838#include "Structure.h"
     39#include "UString.h"
    3940#include "WriteBarrier.h"
    4041#include <wtf/DataLog.h>
     
    220221
    221222#if ENABLE(PARALLEL_GC)
    222 void MarkStackThreadSharedData::markingThreadMain()
     223void MarkStackThreadSharedData::resetChildren()
     224{
     225    for (unsigned i = 0; i < m_markingThreadsMarkStack.size(); ++i)
     226       m_markingThreadsMarkStack[i]->reset();
     227}   
     228
     229size_t MarkStackThreadSharedData::childVisitCount()
     230{       
     231    unsigned long result = 0;
     232    for (unsigned i = 0; i < m_markingThreadsMarkStack.size(); ++i)
     233        result += m_markingThreadsMarkStack[i]->visitCount();
     234    return result;
     235}
     236
     237void MarkStackThreadSharedData::markingThreadMain(SlotVisitor* slotVisitor)
    223238{
    224239    WTF::registerGCThread();
    225240    {
    226         SlotVisitor slotVisitor(*this);
    227         ParallelModeEnabler enabler(slotVisitor);
    228         slotVisitor.drainFromShared(SlotVisitor::SlaveDrain);
    229     }
    230 }
    231 
    232 void MarkStackThreadSharedData::markingThreadStartFunc(void* shared)
    233 {
    234     static_cast<MarkStackThreadSharedData*>(shared)->markingThreadMain();
     241        ParallelModeEnabler enabler(*slotVisitor);
     242        slotVisitor->drainFromShared(SlotVisitor::SlaveDrain);
     243    }
     244    delete slotVisitor;
     245}
     246
     247void MarkStackThreadSharedData::markingThreadStartFunc(void* myVisitor)
     248{               
     249    SlotVisitor* slotVisitor = static_cast<SlotVisitor*>(myVisitor);
     250
     251    slotVisitor->sharedData().markingThreadMain(slotVisitor);
    235252}
    236253#endif
     
    245262#if ENABLE(PARALLEL_GC)
    246263    for (unsigned i = 1; i < Options::numberOfGCMarkers; ++i) {
    247         m_markingThreads.append(createThread(markingThreadStartFunc, this, "JavaScriptCore::Marking"));
     264        SlotVisitor* slotVisitor = new SlotVisitor(*this);
     265        m_markingThreadsMarkStack.append(slotVisitor);
     266        m_markingThreads.append(createThread(markingThreadStartFunc, slotVisitor, "JavaScriptCore::Marking"));
    248267        ASSERT(m_markingThreads.last());
    249268    }
     
    277296    ASSERT(m_opaqueRoots.isEmpty());
    278297#endif
    279    
    280298    m_weakReferenceHarvesters.removeAll();
    281299}
Note: See TracChangeset for help on using the changeset viewer.