Changeset 226725 in webkit for trunk/Source/JavaScriptCore/heap/CodeBlockSet.cpp
- Timestamp:
- Jan 10, 2018, 11:41:12 AM (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/heap/CodeBlockSet.cpp
r226667 r226725 42 42 } 43 43 44 void CodeBlockSet::add(CodeBlock* codeBlock) 45 { 46 LockHolder locker(&m_lock); 47 bool isNewEntry = m_newCodeBlocks.add(codeBlock).isNewEntry; 48 ASSERT_UNUSED(isNewEntry, isNewEntry); 49 } 50 51 void CodeBlockSet::promoteYoungCodeBlocks(const AbstractLocker&) 52 { 53 ASSERT(m_lock.isLocked()); 54 m_oldCodeBlocks.add(m_newCodeBlocks.begin(), m_newCodeBlocks.end()); 55 m_newCodeBlocks.clear(); 56 } 57 58 void CodeBlockSet::clearMarksForFullCollection() 59 { 60 LockHolder locker(&m_lock); 61 for (CodeBlock* codeBlock : m_oldCodeBlocks) 62 codeBlock->clearVisitWeaklyHasBeenCalled(); 63 } 64 65 void CodeBlockSet::lastChanceToFinalize(VM& vm) 66 { 67 LockHolder locker(&m_lock); 68 for (CodeBlock* codeBlock : m_newCodeBlocks) 69 codeBlock->structure(vm)->classInfo()->methodTable.destroy(codeBlock); 70 71 for (CodeBlock* codeBlock : m_oldCodeBlocks) 72 codeBlock->structure(vm)->classInfo()->methodTable.destroy(codeBlock); 73 } 74 75 void CodeBlockSet::deleteUnmarkedAndUnreferenced(VM& vm, CollectionScope scope) 76 { 77 LockHolder locker(&m_lock); 78 79 // Destroying a CodeBlock takes about 1us on average in Speedometer. Full collections in Speedometer 80 // usually have ~2000 CodeBlocks to process. The time it takes to process the whole list varies a 81 // lot. In one extreme case I saw 18ms (on my fast MBP). 82 // 83 // FIXME: use Subspace instead of HashSet and adopt Subspace-based constraint solving. This may 84 // remove the need to eagerly destruct CodeBlocks. 85 // https://bugs.webkit.org/show_bug.cgi?id=180089 86 // 87 // FIXME: make CodeBlock::~CodeBlock a lot faster. It seems insane for that to take 1us or more. 88 // https://bugs.webkit.org/show_bug.cgi?id=180109 89 90 auto consider = [&] (HashSet<CodeBlock*>& set) { 91 set.removeIf( 92 [&] (CodeBlock* codeBlock) -> bool { 93 if (Heap::isMarked(codeBlock)) 94 return false; 95 codeBlock->structure(vm)->classInfo()->methodTable.destroy(codeBlock); 96 return true; 97 }); 98 }; 99 100 switch (scope) { 101 case CollectionScope::Eden: 102 consider(m_newCodeBlocks); 103 break; 104 case CollectionScope::Full: 105 consider(m_oldCodeBlocks); 106 consider(m_newCodeBlocks); 107 break; 108 } 109 110 // Any remaining young CodeBlocks are live and need to be promoted to the set of old CodeBlocks. 111 promoteYoungCodeBlocks(locker); 112 } 113 44 114 bool CodeBlockSet::contains(const AbstractLocker&, void* candidateCodeBlock) 45 115 { … … 48 118 if (!HashSet<CodeBlock*>::isValidValue(codeBlock)) 49 119 return false; 50 return m_ codeBlocks.contains(codeBlock);120 return m_oldCodeBlocks.contains(codeBlock) || m_newCodeBlocks.contains(codeBlock) || m_currentlyExecuting.contains(codeBlock); 51 121 } 52 122 … … 59 129 { 60 130 CommaPrinter comma; 61 out.print("{codeBlocks = ["); 62 for (CodeBlock* codeBlock : m_codeBlocks) 131 out.print("{old = ["); 132 for (CodeBlock* codeBlock : m_oldCodeBlocks) 133 out.print(comma, pointerDump(codeBlock)); 134 out.print("], new = ["); 135 comma = CommaPrinter(); 136 for (CodeBlock* codeBlock : m_newCodeBlocks) 63 137 out.print(comma, pointerDump(codeBlock)); 64 138 out.print("], currentlyExecuting = ["); … … 69 143 } 70 144 71 void CodeBlockSet::add(CodeBlock* codeBlock)72 {73 auto locker = holdLock(m_lock);74 auto result = m_codeBlocks.add(codeBlock);75 RELEASE_ASSERT(result);76 }77 78 void CodeBlockSet::remove(CodeBlock* codeBlock)79 {80 auto locker = holdLock(m_lock);81 bool result = m_codeBlocks.remove(codeBlock);82 RELEASE_ASSERT(result);83 }84 85 145 } // namespace JSC 86 146
Note:
See TracChangeset
for help on using the changeset viewer.