Changeset 181060 in webkit
- Timestamp:
- Mar 4, 2015 6:19:14 PM (9 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r181059 r181060 1 2015-03-04 Andreas Kling <akling@apple.com> 2 3 GC should compute stack bounds and dump registers at the earliest opportunity. 4 <https://webkit.org/b/142310> 5 <rdar://problem/20045624> 6 7 Reviewed by Geoffrey Garen. 8 9 Make Heap::collect() a wrapper function around a collectImpl() where the work is actually done. 10 The wrapper function that grabs a snapshot of the current stack boundaries and register values 11 on entry, and sanitizes the stack on exit. 12 13 This is a speculative fix for what appears to be overly conservative behavior in the garbage 14 collector following r178364 which caused a measurable regression in memory usage on Membuster. 15 The theory being that we were putting pointers to dead things on the stack before scanning it, 16 and by doing that ended up marking things that we'd otherwise discover to be garbage. 17 18 * heap/Heap.cpp: 19 (JSC::Heap::markRoots): 20 (JSC::Heap::gatherStackRoots): 21 (JSC::Heap::collect): 22 (JSC::Heap::collectImpl): 23 * heap/Heap.h: 24 * heap/MachineStackMarker.cpp: 25 (JSC::MachineThreads::gatherFromCurrentThread): 26 (JSC::MachineThreads::gatherConservativeRoots): 27 * heap/MachineStackMarker.h: 28 1 29 2015-03-04 Debarshi Ray <debarshir@gnome.org> 2 30 -
trunk/Source/JavaScriptCore/heap/Heap.cpp
r181010 r181060 514 514 } 515 515 516 void Heap::markRoots(double gcStartTime )516 void Heap::markRoots(double gcStartTime, void* stackOrigin, void* stackTop, MachineThreads::RegisterState& calleeSavedRegisters) 517 517 { 518 518 SamplingRegion samplingRegion("Garbage Collection: Marking"); … … 535 535 // We gather conservative roots before clearing mark bits because conservative 536 536 // gathering uses the mark bits to determine whether a reference is valid. 537 void* dummy;538 ALLOCATE_AND_GET_REGISTER_STATE(registers);539 537 ConservativeRoots conservativeRoots(&m_objectSpace.blocks(), &m_storageSpace); 540 gatherStackRoots(conservativeRoots, &dummy, registers);538 gatherStackRoots(conservativeRoots, stackOrigin, stackTop, calleeSavedRegisters); 541 539 gatherJSStackRoots(conservativeRoots); 542 540 gatherScratchBufferRoots(conservativeRoots); 543 544 sanitizeStackForVM(m_vm);545 541 546 542 clearLivenessData(); … … 599 595 } 600 596 601 void Heap::gatherStackRoots(ConservativeRoots& roots, void* * dummy, MachineThreads::RegisterState& registers)597 void Heap::gatherStackRoots(ConservativeRoots& roots, void* stackOrigin, void* stackTop, MachineThreads::RegisterState& calleeSavedRegisters) 602 598 { 603 599 GCPHASE(GatherStackRoots); 604 600 m_jitStubRoutines.clearMarks(); 605 m_machineThreads.gatherConservativeRoots(roots, m_jitStubRoutines, m_codeBlocks, dummy, registers);601 m_machineThreads.gatherConservativeRoots(roots, m_jitStubRoutines, m_codeBlocks, stackOrigin, stackTop, calleeSavedRegisters); 606 602 } 607 603 … … 1004 1000 static double minute = 60.0; 1005 1001 1006 void Heap::collect(HeapOperation collectionType) 1002 NEVER_INLINE void Heap::collect(HeapOperation collectionType) 1003 { 1004 void* stackTop; 1005 ALLOCATE_AND_GET_REGISTER_STATE(registers); 1006 1007 collectImpl(collectionType, wtfThreadData().stack().origin(), &stackTop, registers); 1008 1009 sanitizeStackForVM(m_vm); 1010 } 1011 1012 NEVER_INLINE void Heap::collectImpl(HeapOperation collectionType, void* stackOrigin, void* stackTop, MachineThreads::RegisterState& calleeSavedRegisters) 1007 1013 { 1008 1014 #if ENABLE(ALLOCATION_LOGGING) … … 1049 1055 flushWriteBarrierBuffer(); 1050 1056 1051 markRoots(gcStartTime );1057 markRoots(gcStartTime, stackOrigin, stackTop, calleeSavedRegisters); 1052 1058 1053 1059 if (m_verifier) { -
trunk/Source/JavaScriptCore/heap/Heap.h
r181019 r181060 274 274 JS_EXPORT_PRIVATE void reportExtraMemoryCostSlowCase(size_t); 275 275 276 void collectImpl(HeapOperation, void* stackOrigin, void* stackTop, MachineThreads::RegisterState&); 277 276 278 void suspendCompilerThreads(); 277 279 void willStartCollection(HeapOperation collectionType); … … 281 283 void stopAllocation(); 282 284 283 void markRoots(double gcStartTime );284 void gatherStackRoots(ConservativeRoots&, void* * dummy, MachineThreads::RegisterState& registers);285 void markRoots(double gcStartTime, void* stackOrigin, void* stackTop, MachineThreads::RegisterState&); 286 void gatherStackRoots(ConservativeRoots&, void* stackOrigin, void* stackTop, MachineThreads::RegisterState&); 285 287 void gatherJSStackRoots(ConservativeRoots&); 286 288 void gatherScratchBufferRoots(ConservativeRoots&); -
trunk/Source/JavaScriptCore/heap/MachineStackMarker.cpp
r180716 r181060 277 277 } 278 278 279 void MachineThreads::gatherFromCurrentThread(ConservativeRoots& conservativeRoots, JITStubRoutineSet& jitStubRoutines, CodeBlockSet& codeBlocks, void* stack Current, RegisterState& registers)280 { 281 void* registersBegin = & registers;282 void* registersEnd = reinterpret_cast<void*>(roundUpToMultipleOf<sizeof(void*)>(reinterpret_cast<uintptr_t>(& registers + 1)));279 void MachineThreads::gatherFromCurrentThread(ConservativeRoots& conservativeRoots, JITStubRoutineSet& jitStubRoutines, CodeBlockSet& codeBlocks, void* stackOrigin, void* stackTop, RegisterState& calleeSavedRegisters) 280 { 281 void* registersBegin = &calleeSavedRegisters; 282 void* registersEnd = reinterpret_cast<void*>(roundUpToMultipleOf<sizeof(void*)>(reinterpret_cast<uintptr_t>(&calleeSavedRegisters + 1))); 283 283 conservativeRoots.add(registersBegin, registersEnd, jitStubRoutines, codeBlocks); 284 284 285 void* stackBegin = stackCurrent; 286 void* stackEnd = wtfThreadData().stack().origin(); 287 conservativeRoots.add(stackBegin, stackEnd, jitStubRoutines, codeBlocks); 285 conservativeRoots.add(stackTop, stackOrigin, jitStubRoutines, codeBlocks); 288 286 } 289 287 … … 615 613 } 616 614 617 void MachineThreads::gatherConservativeRoots(ConservativeRoots& conservativeRoots, JITStubRoutineSet& jitStubRoutines, CodeBlockSet& codeBlocks, void* stack Current, RegisterState& currentThreadRegisters)618 { 619 gatherFromCurrentThread(conservativeRoots, jitStubRoutines, codeBlocks, stack Current, currentThreadRegisters);615 void MachineThreads::gatherConservativeRoots(ConservativeRoots& conservativeRoots, JITStubRoutineSet& jitStubRoutines, CodeBlockSet& codeBlocks, void* stackOrigin, void* stackTop, RegisterState& calleeSavedRegisters) 616 { 617 gatherFromCurrentThread(conservativeRoots, jitStubRoutines, codeBlocks, stackOrigin, stackTop, calleeSavedRegisters); 620 618 621 619 size_t size; -
trunk/Source/JavaScriptCore/heap/MachineStackMarker.h
r180716 r181060 43 43 ~MachineThreads(); 44 44 45 void gatherConservativeRoots(ConservativeRoots&, JITStubRoutineSet&, CodeBlockSet&, void* stack Current, RegisterState& registers);45 void gatherConservativeRoots(ConservativeRoots&, JITStubRoutineSet&, CodeBlockSet&, void* stackOrigin, void* stackTop, RegisterState& calleeSavedRegisters); 46 46 47 47 JS_EXPORT_PRIVATE void addCurrentThread(); // Only needs to be called by clients that can use the same heap from multiple threads. … … 50 50 class Thread; 51 51 52 void gatherFromCurrentThread(ConservativeRoots&, JITStubRoutineSet&, CodeBlockSet&, void* stack Current, RegisterState& registers);52 void gatherFromCurrentThread(ConservativeRoots&, JITStubRoutineSet&, CodeBlockSet&, void* stackOrigin, void* stackTop, RegisterState& calleeSavedRegisters); 53 53 54 54 void tryCopyOtherThreadStack(Thread*, void*, size_t capacity, size_t*);
Note: See TracChangeset
for help on using the changeset viewer.