Changeset 47022 in webkit for trunk/JavaScriptCore/runtime/Collector.cpp
- Timestamp:
- Aug 10, 2009, 9:35:02 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/runtime/Collector.cpp
r46703 r47022 1 1 /* 2 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.2 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. 3 3 * Copyright (C) 2007 Eric Seidel <[email protected]> 4 4 * … … 31 31 #include "JSString.h" 32 32 #include "JSValue.h" 33 #include "MarkStack.h" 33 34 #include "Nodes.h" 34 35 #include "Tracing.h" … … 643 644 #define IS_HALF_CELL_ALIGNED(p) (((intptr_t)(p) & (CELL_MASK >> 1)) == 0) 644 645 645 void Heap::markConservatively( void* start, void* end)646 void Heap::markConservatively(MarkStack& markStack, void* start, void* end) 646 647 { 647 648 if (start > end) { … … 684 685 if ((primaryBlocks[block] == blockAddr) & (offset <= lastCellOffset)) { 685 686 if (reinterpret_cast<CollectorCell*>(xAsBits)->u.freeCell.zeroIfFree != 0) { 686 JSCell* imp = reinterpret_cast<JSCell*>(xAsBits); 687 if (!imp->marked()) 688 imp->mark(); 687 markStack.append(reinterpret_cast<JSCell*>(xAsBits)); 688 markStack.drain(); 689 689 } 690 690 break; … … 697 697 } 698 698 699 void NEVER_INLINE Heap::markCurrentThreadConservativelyInternal( )699 void NEVER_INLINE Heap::markCurrentThreadConservativelyInternal(MarkStack& markStack) 700 700 { 701 701 void* dummy; 702 702 void* stackPointer = &dummy; 703 703 void* stackBase = currentThreadStackBase(); 704 markConservatively( stackPointer, stackBase);705 } 706 707 void Heap::markCurrentThreadConservatively( )704 markConservatively(markStack, stackPointer, stackBase); 705 } 706 707 void Heap::markCurrentThreadConservatively(MarkStack& markStack) 708 708 { 709 709 // setjmp forces volatile registers onto the stack … … 718 718 #endif 719 719 720 markCurrentThreadConservativelyInternal( );720 markCurrentThreadConservativelyInternal(markStack); 721 721 } 722 722 … … 850 850 } 851 851 852 void Heap::markOtherThreadConservatively( Thread* thread)852 void Heap::markOtherThreadConservatively(MarkStack& markStack, Thread* thread) 853 853 { 854 854 suspendThread(thread->platformThread); … … 858 858 859 859 // mark the thread's registers 860 markConservatively( static_cast<void*>(®s), static_cast<void*>(reinterpret_cast<char*>(®s) + regSize));860 markConservatively(markStack, static_cast<void*>(®s), static_cast<void*>(reinterpret_cast<char*>(®s) + regSize)); 861 861 862 862 void* stackPointer = otherThreadStackPointer(regs); 863 markConservatively( stackPointer, thread->stackBase);863 markConservatively(markStack, stackPointer, thread->stackBase); 864 864 865 865 resumeThread(thread->platformThread); … … 868 868 #endif 869 869 870 void Heap::markStackObjectsConservatively( )871 { 872 markCurrentThreadConservatively( );870 void Heap::markStackObjectsConservatively(MarkStack& markStack) 871 { 872 markCurrentThreadConservatively(markStack); 873 873 874 874 #if ENABLE(JSC_MULTIPLE_THREADS) … … 880 880 #ifndef NDEBUG 881 881 // Forbid malloc during the mark phase. Marking a thread suspends it, so 882 // a malloc inside mark () would risk a deadlock with a thread that had been882 // a malloc inside markChildren() would risk a deadlock with a thread that had been 883 883 // suspended while holding the malloc lock. 884 884 fastMallocForbid(); … … 888 888 for (Thread* thread = m_registeredThreads; thread; thread = thread->next) { 889 889 if (!pthread_equal(thread->posixThread, pthread_self())) 890 markOtherThreadConservatively( thread);890 markOtherThreadConservatively(markStack, thread); 891 891 } 892 892 #ifndef NDEBUG … … 948 948 } 949 949 950 void Heap::markProtectedObjects( )950 void Heap::markProtectedObjects(MarkStack& markStack) 951 951 { 952 952 if (m_protectedValuesMutex) … … 956 956 for (ProtectCountSet::iterator it = m_protectedValues.begin(); it != end; ++it) { 957 957 JSCell* val = it->first; 958 if (!val->marked()) 959 val->mark(); 958 if (!val->marked()) { 959 markStack.append(val); 960 markStack.drain(); 961 } 960 962 } 961 963 … … 1062 1064 return numLiveObjects; 1063 1065 } 1064 1066 1065 1067 bool Heap::collect() 1066 1068 { … … 1081 1083 1082 1084 // MARK: first mark all referenced objects recursively starting out from the set of root objects 1083 1084 markStackObjectsConservatively( );1085 markProtectedObjects( );1085 MarkStack& markStack = m_globalData->markStack; 1086 markStackObjectsConservatively(markStack); 1087 markProtectedObjects(markStack); 1086 1088 if (m_markListSet && m_markListSet->size()) 1087 MarkedArgumentBuffer::markLists( *m_markListSet);1089 MarkedArgumentBuffer::markLists(markStack, *m_markListSet); 1088 1090 if (m_globalData->exception && !m_globalData->exception.marked()) 1089 m _globalData->exception.mark();1090 m_globalData->interpreter->registerFile().markCallFrames( this);1091 markStack.append(m_globalData->exception); 1092 m_globalData->interpreter->registerFile().markCallFrames(markStack, this); 1091 1093 m_globalData->smallStrings.mark(); 1092 1094 if (m_globalData->scopeNodeBeingReparsed) 1093 m_globalData->scopeNodeBeingReparsed->mark ();1095 m_globalData->scopeNodeBeingReparsed->markAggregate(markStack); 1094 1096 if (m_globalData->firstStringifierToMark) 1095 JSONObject::markStringifiers(m_globalData->firstStringifierToMark); 1096 1097 JSONObject::markStringifiers(markStack, m_globalData->firstStringifierToMark); 1098 1099 markStack.drain(); 1100 markStack.compact(); 1097 1101 JAVASCRIPTCORE_GC_MARKED(); 1098 1102
Note:
See TracChangeset
for help on using the changeset viewer.