Changeset 206172 in webkit
- Timestamp:
- Sep 20, 2016 2:04:06 PM (8 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 15 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r206164 r206172 1 2016-09-20 Filip Pizlo <fpizlo@apple.com> 2 3 Rename MarkedSpace::version/MarkedBlock::version to MarkedSpace::markingVersion/MarkedBlock::markingVersion 4 https://bugs.webkit.org/show_bug.cgi?id=162310 5 6 Reviewed by Geoffrey Garen. 7 8 In bug 162309, which is part of my concurrent GC work, I'll need to introduce a second 9 version-based flip. This one will be for newlyAllocated bits. This will allow me to 10 cheaply preserve per-object live state during marking. MarkedBlock::aboutToMarkSlow() will 11 do this instead of clearMarks(): 12 13 - Walk the mark bits, simultaneously counting the number of set bits and clearing 14 them. 15 - If the count is zero, then we're done. 16 - If the count is equal to the max number of cells in the block, then set the 17 allocated bit for the block. 18 - If the count is something else, create a newlyAllocated vector. 19 20 The hope is that the last mode is going to be rare, since most blocks are not fragmented 21 at end of GC. Usually, we will fill them in with objects by allocating! But if we do 22 create newlyAllocated bits then we need to have some way of blowing them away later. 23 24 This is where a second version comes in. We can have a version for newlyAllocated bits, 25 which we increment at the end of marking, at around the same time that we clear all 26 allocated bits. 27 28 This means that the MarkedBlock will have two different version-based flips, so terms like 29 "flip" and "version" aren't enough. 30 31 This patch gets rid of the term "flip" entirely. It's a term of art in GCs that refers to 32 the state change at the beginning or end of GC. It refers to the logical state change, not 33 the physical one. It doesn't actually make sense to speak of a block being flipped 34 independently of other blocks. It's true that our implementation of the flip makes some 35 state updates happen lazily, but the block updating itself in some way (like clearing mark 36 bits) isn't the flip - the flip already happened when the version was incremented. 37 38 We no longer refer to a version without qualifying what kind of version it is. The type is 39 HeapVersion. All of the version members were renamed to markingVersion, to reflect the 40 fact that this version is just used for doing things to marking state. Instead of asking 41 if the block needsFlip(), we ask if areMarksStale(). 42 43 This will let us introduce a second version for newlyAllocated, and will let us speak of 44 the two versions unambiguously. 45 46 * heap/CellContainer.h: 47 * heap/CellContainerInlines.h: 48 (JSC::CellContainer::isMarked): 49 (JSC::CellContainer::isMarkedOrNewlyAllocated): 50 (JSC::CellContainer::aboutToMark): 51 (JSC::CellContainer::areMarksStale): 52 (JSC::CellContainer::needsFlip): Deleted. 53 * heap/ConservativeRoots.cpp: 54 (JSC::ConservativeRoots::genericAddPointer): 55 (JSC::ConservativeRoots::genericAddSpan): 56 * heap/HeapInlines.h: 57 (JSC::Heap::isMarked): 58 (JSC::Heap::isMarkedConcurrently): 59 (JSC::Heap::testAndSetMarked): 60 * heap/HeapUtil.h: 61 (JSC::HeapUtil::findGCObjectPointersForMarking): 62 * heap/MarkedAllocator.cpp: 63 (JSC::MarkedAllocator::isPagedOut): 64 * heap/MarkedBlock.cpp: 65 (JSC::MarkedBlock::MarkedBlock): 66 (JSC::MarkedBlock::Handle::specializedSweep): 67 (JSC::MarkedBlock::Handle::sweepHelperSelectSweepMode): 68 (JSC::MarkedBlock::Handle::sweepHelperSelectMarksMode): 69 (JSC::MarkedBlock::aboutToMarkSlow): 70 (JSC::MarkedBlock::clearMarks): 71 (JSC::MarkedBlock::assertMarksNotStale): 72 (JSC::MarkedBlock::areMarksStale): 73 (JSC::MarkedBlock::Handle::areMarksStale): 74 (JSC::MarkedBlock::isMarked): 75 (JSC::MarkedBlock::Handle::isMarkedOrNewlyAllocated): 76 (JSC::MarkedBlock::isMarkedOrNewlyAllocated): 77 (JSC::MarkedBlock::markCount): 78 (JSC::MarkedBlock::Handle::isLive): 79 (JSC::MarkedBlock::Handle::isLiveCell): 80 (JSC::MarkedBlock::Handle::sweepHelperSelectFlipMode): Deleted. 81 (JSC::MarkedBlock::assertFlipped): Deleted. 82 (JSC::MarkedBlock::needsFlip): Deleted. 83 (JSC::MarkedBlock::Handle::needsFlip): Deleted. 84 * heap/MarkedBlock.h: 85 (JSC::MarkedBlock::areMarksStale): 86 (JSC::MarkedBlock::aboutToMark): 87 (JSC::MarkedBlock::assertMarksNotStale): 88 (JSC::MarkedBlock::Handle::assertMarksNotStale): 89 (JSC::MarkedBlock::isMarked): 90 (JSC::MarkedBlock::isMarkedConcurrently): 91 (JSC::MarkedBlock::testAndSetMarked): 92 (JSC::MarkedBlock::Handle::isMarkedOrNewlyAllocated): 93 (JSC::MarkedBlock::isMarkedOrNewlyAllocated): 94 (JSC::MarkedBlock::needsFlip): Deleted. 95 (JSC::MarkedBlock::assertFlipped): Deleted. 96 (JSC::MarkedBlock::Handle::assertFlipped): Deleted. 97 * heap/MarkedBlockInlines.h: 98 (JSC::MarkedBlock::Handle::isLive): 99 (JSC::MarkedBlock::Handle::isLiveCell): 100 (JSC::MarkedBlock::resetMarkingVersion): 101 (JSC::MarkedBlock::resetVersion): Deleted. 102 * heap/MarkedSpace.cpp: 103 (JSC::MarkedSpace::beginMarking): 104 * heap/MarkedSpace.h: 105 (JSC::MarkedSpace::markingVersion): 106 (JSC::MarkedSpace::version): Deleted. 107 * heap/SlotVisitor.cpp: 108 (JSC::SlotVisitor::SlotVisitor): 109 (JSC::SlotVisitor::didStartMarking): 110 (JSC::SlotVisitor::appendJSCellOrAuxiliary): 111 (JSC::SlotVisitor::setMarkedAndAppendToMarkStack): 112 (JSC::SlotVisitor::markAuxiliary): 113 * heap/SlotVisitor.h: 114 (JSC::SlotVisitor::markingVersion): 115 (JSC::SlotVisitor::version): Deleted. 116 * heap/WeakBlock.cpp: 117 (JSC::WeakBlock::specializedVisit): 118 (JSC::WeakBlock::reap): 119 1 120 2016-09-20 Ryan Haddad <ryanhaddad@apple.com> 2 121 -
trunk/Source/JavaScriptCore/heap/CellContainer.h
r206154 r206172 79 79 } 80 80 81 void aboutToMark(HeapVersion );82 bool needsFlip() const;81 void aboutToMark(HeapVersion markingVersion); 82 bool areMarksStale() const; 83 83 84 84 bool isMarked(HeapCell*) const; 85 bool isMarked(HeapVersion , HeapCell*) const;85 bool isMarked(HeapVersion markingVersion, HeapCell*) const; 86 86 bool isMarkedOrNewlyAllocated(HeapCell*) const; 87 bool isMarkedOrNewlyAllocated(HeapVersion , HeapCell*) const;87 bool isMarkedOrNewlyAllocated(HeapVersion markingVersion, HeapCell*) const; 88 88 89 89 void noteMarked(); -
trunk/Source/JavaScriptCore/heap/CellContainerInlines.h
r206154 r206172 53 53 } 54 54 55 inline bool CellContainer::isMarked(HeapVersion version, HeapCell* cell) const55 inline bool CellContainer::isMarked(HeapVersion markingVersion, HeapCell* cell) const 56 56 { 57 57 if (isLargeAllocation()) 58 58 return largeAllocation().isMarked(); 59 return markedBlock().isMarked( version, cell);59 return markedBlock().isMarked(markingVersion, cell); 60 60 } 61 61 … … 67 67 } 68 68 69 inline bool CellContainer::isMarkedOrNewlyAllocated(HeapVersion version, HeapCell* cell) const69 inline bool CellContainer::isMarkedOrNewlyAllocated(HeapVersion markingVersion, HeapCell* cell) const 70 70 { 71 71 if (isLargeAllocation()) 72 72 return largeAllocation().isMarkedOrNewlyAllocated(); 73 return markedBlock().isMarkedOrNewlyAllocated( version, cell);73 return markedBlock().isMarkedOrNewlyAllocated(markingVersion, cell); 74 74 } 75 75 … … 94 94 } 95 95 96 inline void CellContainer::aboutToMark(HeapVersion heapVersion)96 inline void CellContainer::aboutToMark(HeapVersion markingVersion) 97 97 { 98 98 if (!isLargeAllocation()) 99 markedBlock().aboutToMark( heapVersion);99 markedBlock().aboutToMark(markingVersion); 100 100 } 101 101 102 inline bool CellContainer:: needsFlip() const102 inline bool CellContainer::areMarksStale() const 103 103 { 104 104 if (isLargeAllocation()) 105 105 return false; 106 return markedBlock(). needsFlip();106 return markedBlock().areMarksStale(); 107 107 } 108 108 -
trunk/Source/JavaScriptCore/heap/ConservativeRoots.cpp
r206154 r206172 67 67 68 68 template<typename MarkHook> 69 inline void ConservativeRoots::genericAddPointer(void* p, HeapVersion version, TinyBloomFilter filter, MarkHook& markHook)69 inline void ConservativeRoots::genericAddPointer(void* p, HeapVersion markingVersion, TinyBloomFilter filter, MarkHook& markHook) 70 70 { 71 71 markHook.mark(p); 72 72 73 73 HeapUtil::findGCObjectPointersForMarking( 74 m_heap, version, filter, p,74 m_heap, markingVersion, filter, p, 75 75 [&] (void* p) { 76 76 if (m_size == m_capacity) … … 95 95 96 96 TinyBloomFilter filter = m_heap.objectSpace().blocks().filter(); // Make a local copy of filter to show the compiler it won't alias, and can be register-allocated. 97 HeapVersion version = m_heap.objectSpace().version();97 HeapVersion markingVersion = m_heap.objectSpace().markingVersion(); 98 98 for (char** it = static_cast<char**>(begin); it != static_cast<char**>(end); ++it) 99 genericAddPointer(*it, version, filter, markHook);99 genericAddPointer(*it, markingVersion, filter, markHook); 100 100 } 101 101 -
trunk/Source/JavaScriptCore/heap/HeapInlines.h
r206154 r206172 83 83 MarkedBlock& block = cell->markedBlock(); 84 84 return block.isMarked( 85 block.vm()->heap.objectSpace(). version(), cell);85 block.vm()->heap.objectSpace().markingVersion(), cell); 86 86 } 87 87 … … 93 93 MarkedBlock& block = cell->markedBlock(); 94 94 return block.isMarkedConcurrently( 95 block.vm()->heap.objectSpace(). version(), cell);96 } 97 98 ALWAYS_INLINE bool Heap::testAndSetMarked(HeapVersion version, const void* rawCell)95 block.vm()->heap.objectSpace().markingVersion(), cell); 96 } 97 98 ALWAYS_INLINE bool Heap::testAndSetMarked(HeapVersion markingVersion, const void* rawCell) 99 99 { 100 100 HeapCell* cell = bitwise_cast<HeapCell*>(rawCell); … … 102 102 return cell->largeAllocation().testAndSetMarked(); 103 103 MarkedBlock& block = cell->markedBlock(); 104 block.aboutToMark( version);104 block.aboutToMark(markingVersion); 105 105 return block.testAndSetMarked(cell); 106 106 } -
trunk/Source/JavaScriptCore/heap/HeapUtil.h
r206154 r206172 47 47 template<typename Func> 48 48 static void findGCObjectPointersForMarking( 49 Heap& heap, HeapVersion heapVersion, TinyBloomFilter filter, void* passedPointer,49 Heap& heap, HeapVersion markingVersion, TinyBloomFilter filter, void* passedPointer, 50 50 const Func& func) 51 51 { … … 86 86 && previousCandidate->handle().cellKind() == HeapCell::Auxiliary) { 87 87 previousPointer = static_cast<char*>(previousCandidate->handle().cellAlign(previousPointer)); 88 if (previousCandidate->handle().isLiveCell( heapVersion, previousPointer))88 if (previousCandidate->handle().isLiveCell(markingVersion, previousPointer)) 89 89 func(previousPointer); 90 90 } … … 100 100 101 101 auto tryPointer = [&] (void* pointer) { 102 if (candidate->handle().isLiveCell( heapVersion, pointer))102 if (candidate->handle().isLiveCell(markingVersion, pointer)) 103 103 func(pointer); 104 104 }; -
trunk/Source/JavaScriptCore/heap/MarkedAllocator.cpp
r206154 r206172 56 56 if (block) { 57 57 // Forces us to touch the memory of the block, but has no semantic effect. 58 if (block-> needsFlip())59 block->block().reset Version();58 if (block->areMarksStale()) 59 block->block().resetMarkingVersion(); 60 60 } 61 61 ++itersSinceLastTimeCheck; -
trunk/Source/JavaScriptCore/heap/MarkedBlock.cpp
r206154 r206172 78 78 79 79 MarkedBlock::MarkedBlock(VM& vm, Handle& handle) 80 : m_ version(MarkedSpace::nullVersion)80 : m_markingVersion(MarkedSpace::nullVersion) 81 81 , m_handle(handle) 82 82 , m_vm(&vm) … … 84 84 } 85 85 86 template<MarkedBlock::Handle::EmptyMode emptyMode, MarkedBlock::Handle::SweepMode sweepMode, DestructionMode destructionMode, MarkedBlock::Handle::ScribbleMode scribbleMode, MarkedBlock::Handle::NewlyAllocatedMode newlyAllocatedMode, MarkedBlock::Handle:: FlipMode flipMode>86 template<MarkedBlock::Handle::EmptyMode emptyMode, MarkedBlock::Handle::SweepMode sweepMode, DestructionMode destructionMode, MarkedBlock::Handle::ScribbleMode scribbleMode, MarkedBlock::Handle::NewlyAllocatedMode newlyAllocatedMode, MarkedBlock::Handle::MarksMode marksMode> 87 87 FreeList MarkedBlock::Handle::specializedSweep() 88 88 { … … 99 99 && emptyMode == IsEmpty 100 100 && newlyAllocatedMode == DoesNotHaveNewlyAllocated) { 101 ASSERT( flipMode == NeedsFlip);101 ASSERT(marksMode == MarksStale); 102 102 103 103 char* startOfLastCell = static_cast<char*>(cellAlign(block.atoms() + m_endAtom - 1)); … … 125 125 for (size_t i = firstAtom(); i < m_endAtom; i += m_atomsPerCell) { 126 126 if (emptyMode == NotEmpty 127 && (( flipMode == DoesNotNeedFlip&& block.m_marks.get(i))127 && ((marksMode == MarksNotStale && block.m_marks.get(i)) 128 128 || (newlyAllocatedMode == HasNewlyAllocated && m_newlyAllocated->get(i)))) { 129 129 isEmpty = false; … … 217 217 { 218 218 if (sweepMode == SweepToFreeList) 219 return sweepHelperSelect FlipMode<emptyMode, SweepToFreeList, destructionMode, scribbleMode, newlyAllocatedMode>();220 return sweepHelperSelect FlipMode<emptyMode, SweepOnly, destructionMode, scribbleMode, newlyAllocatedMode>();219 return sweepHelperSelectMarksMode<emptyMode, SweepToFreeList, destructionMode, scribbleMode, newlyAllocatedMode>(); 220 return sweepHelperSelectMarksMode<emptyMode, SweepOnly, destructionMode, scribbleMode, newlyAllocatedMode>(); 221 221 } 222 222 223 223 template<MarkedBlock::Handle::EmptyMode emptyMode, MarkedBlock::Handle::SweepMode sweepMode, DestructionMode destructionMode, MarkedBlock::Handle::ScribbleMode scribbleMode, MarkedBlock::Handle::NewlyAllocatedMode newlyAllocatedMode> 224 FreeList MarkedBlock::Handle::sweepHelperSelect FlipMode()225 { 226 if ( needsFlip())227 return specializedSweep<emptyMode, sweepMode, destructionMode, scribbleMode, newlyAllocatedMode, NeedsFlip>();228 return specializedSweep<emptyMode, sweepMode, destructionMode, scribbleMode, newlyAllocatedMode, DoesNotNeedFlip>();224 FreeList MarkedBlock::Handle::sweepHelperSelectMarksMode() 225 { 226 if (areMarksStale()) 227 return specializedSweep<emptyMode, sweepMode, destructionMode, scribbleMode, newlyAllocatedMode, MarksStale>(); 228 return specializedSweep<emptyMode, sweepMode, destructionMode, scribbleMode, newlyAllocatedMode, MarksNotStale>(); 229 229 } 230 230 … … 343 343 } 344 344 345 void MarkedBlock::aboutToMarkSlow(HeapVersion heapVersion)345 void MarkedBlock::aboutToMarkSlow(HeapVersion markingVersion) 346 346 { 347 347 ASSERT(vm()->heap.objectSpace().isMarking()); 348 348 LockHolder locker(m_lock); 349 if ( needsFlip(heapVersion)) {350 clearMarks( heapVersion);349 if (areMarksStale(markingVersion)) { 350 clearMarks(markingVersion); 351 351 // This means we're the first ones to mark any object in this block. 352 352 handle().allocator()->atomicSetAndCheckIsMarkingNotEmpty(&handle(), true); … … 356 356 void MarkedBlock::clearMarks() 357 357 { 358 clearMarks(vm()->heap.objectSpace(). version());359 } 360 361 void MarkedBlock::clearMarks(HeapVersion heapVersion)358 clearMarks(vm()->heap.objectSpace().markingVersion()); 359 } 360 361 void MarkedBlock::clearMarks(HeapVersion markingVersion) 362 362 { 363 363 m_marks.clearAll(); 364 364 clearHasAnyMarked(); 365 365 WTF::storeStoreFence(); 366 m_ version = heapVersion;366 m_markingVersion = markingVersion; 367 367 } 368 368 369 369 #if !ASSERT_DISABLED 370 void MarkedBlock::assert Flipped()371 { 372 ASSERT(m_ version == vm()->heap.objectSpace().version());370 void MarkedBlock::assertMarksNotStale() 371 { 372 ASSERT(m_markingVersion == vm()->heap.objectSpace().markingVersion()); 373 373 } 374 374 #endif // !ASSERT_DISABLED 375 375 376 bool MarkedBlock:: needsFlip()377 { 378 return needsFlip(vm()->heap.objectSpace().version());379 } 380 381 bool MarkedBlock::Handle:: needsFlip()382 { 383 return m_block-> needsFlip();376 bool MarkedBlock::areMarksStale() 377 { 378 return areMarksStale(vm()->heap.objectSpace().markingVersion()); 379 } 380 381 bool MarkedBlock::Handle::areMarksStale() 382 { 383 return m_block->areMarksStale(); 384 384 } 385 385 386 386 bool MarkedBlock::isMarked(const void* p) 387 387 { 388 return isMarked(vm()->heap.objectSpace(). version(), p);388 return isMarked(vm()->heap.objectSpace().markingVersion(), p); 389 389 } 390 390 391 391 bool MarkedBlock::Handle::isMarkedOrNewlyAllocated(const HeapCell* cell) 392 392 { 393 return isMarkedOrNewlyAllocated(vm()->heap.objectSpace(). version(), cell);393 return isMarkedOrNewlyAllocated(vm()->heap.objectSpace().markingVersion(), cell); 394 394 } 395 395 396 396 bool MarkedBlock::isMarkedOrNewlyAllocated(const HeapCell* cell) 397 397 { 398 return isMarkedOrNewlyAllocated(vm()->heap.objectSpace(). version(), cell);398 return isMarkedOrNewlyAllocated(vm()->heap.objectSpace().markingVersion(), cell); 399 399 } 400 400 … … 410 410 size_t MarkedBlock::markCount() 411 411 { 412 return needsFlip() ? 0 : m_marks.count();412 return areMarksStale() ? 0 : m_marks.count(); 413 413 } 414 414 … … 477 477 bool MarkedBlock::Handle::isLive(const HeapCell* cell) 478 478 { 479 return isLive(vm()->heap.objectSpace(). version(), cell);479 return isLive(vm()->heap.objectSpace().markingVersion(), cell); 480 480 } 481 481 482 482 bool MarkedBlock::Handle::isLiveCell(const void* p) 483 483 { 484 return isLiveCell(vm()->heap.objectSpace(). version(), p);484 return isLiveCell(vm()->heap.objectSpace().markingVersion(), p); 485 485 } 486 486 -
trunk/Source/JavaScriptCore/heap/MarkedBlock.h
r206154 r206172 155 155 size_t size(); 156 156 157 inline bool isLive(HeapVersion , const HeapCell*);158 inline bool isLiveCell(HeapVersion , const void*);157 inline bool isLive(HeapVersion markingVersion, const HeapCell*); 158 inline bool isLiveCell(HeapVersion markingVersion, const void*); 159 159 160 160 bool isLive(const HeapCell*); … … 162 162 163 163 bool isMarkedOrNewlyAllocated(const HeapCell*); 164 bool isMarkedOrNewlyAllocated(HeapVersion , const HeapCell*);164 bool isMarkedOrNewlyAllocated(HeapVersion markingVersion, const HeapCell*); 165 165 166 166 bool isNewlyAllocated(const void*); … … 174 174 template <typename Functor> inline IterationStatus forEachDeadCell(const Functor&); 175 175 176 bool needsFlip();177 178 void assert Flipped();176 bool areMarksStale(); 177 178 void assertMarksNotStale(); 179 179 180 180 bool isFreeListed() const { return m_isFreeListed; } … … 209 209 210 210 template<EmptyMode, SweepMode, DestructionMode, ScribbleMode, NewlyAllocatedMode> 211 FreeList sweepHelperSelect FlipMode();212 213 enum FlipMode { NeedsFlip, DoesNotNeedFlip};214 215 template<EmptyMode, SweepMode, DestructionMode, ScribbleMode, NewlyAllocatedMode, FlipMode>211 FreeList sweepHelperSelectMarksMode(); 212 213 enum MarksMode { MarksStale, MarksNotStale }; 214 215 template<EmptyMode, SweepMode, DestructionMode, ScribbleMode, NewlyAllocatedMode, MarksMode> 216 216 FreeList specializedSweep(); 217 217 … … 253 253 254 254 bool isMarked(const void*); 255 bool isMarked(HeapVersion , const void*);256 bool isMarkedConcurrently(HeapVersion , const void*);255 bool isMarked(HeapVersion markingVersion, const void*); 256 bool isMarkedConcurrently(HeapVersion markingVersion, const void*); 257 257 bool testAndSetMarked(const void*); 258 258 259 259 bool isMarkedOrNewlyAllocated(const HeapCell*); 260 bool isMarkedOrNewlyAllocated(HeapVersion , const HeapCell*);260 bool isMarkedOrNewlyAllocated(HeapVersion markingVersion, const HeapCell*); 261 261 262 262 bool isAtom(const void*); … … 271 271 WeakSet& weakSet(); 272 272 273 bool needsFlip(HeapVersion);274 bool needsFlip();275 276 void aboutToMark(HeapVersion );277 278 void assert Flipped();273 bool areMarksStale(HeapVersion markingVersion); 274 bool areMarksStale(); 275 276 void aboutToMark(HeapVersion markingVersion); 277 278 void assertMarksNotStale(); 279 279 280 280 bool needsDestruction() const { return m_needsDestruction; } 281 281 282 inline void reset Version();282 inline void resetMarkingVersion(); 283 283 284 284 private: … … 290 290 Atom* atoms(); 291 291 292 void aboutToMarkSlow(HeapVersion );292 void aboutToMarkSlow(HeapVersion markingVersion); 293 293 void clearMarks(); 294 void clearMarks(HeapVersion );294 void clearMarks(HeapVersion markingVersion); 295 295 void clearHasAnyMarked(); 296 296 … … 329 329 int16_t m_markCountBias; 330 330 331 HeapVersion m_ version;331 HeapVersion m_markingVersion; 332 332 333 333 Handle& m_handle; … … 470 470 } 471 471 472 inline bool MarkedBlock:: needsFlip(HeapVersion heapVersion)473 { 474 return heapVersion != m_version;475 } 476 477 inline void MarkedBlock::aboutToMark(HeapVersion heapVersion)478 { 479 if (UNLIKELY( needsFlip(heapVersion)))480 aboutToMarkSlow( heapVersion);472 inline bool MarkedBlock::areMarksStale(HeapVersion markingVersion) 473 { 474 return markingVersion != m_markingVersion; 475 } 476 477 inline void MarkedBlock::aboutToMark(HeapVersion markingVersion) 478 { 479 if (UNLIKELY(areMarksStale(markingVersion))) 480 aboutToMarkSlow(markingVersion); 481 481 WTF::loadLoadFence(); 482 482 } 483 483 484 484 #if ASSERT_DISABLED 485 inline void MarkedBlock::assert Flipped()485 inline void MarkedBlock::assertMarksNotStale() 486 486 { 487 487 } 488 488 #endif // ASSERT_DISABLED 489 489 490 inline void MarkedBlock::Handle::assert Flipped()491 { 492 block().assert Flipped();493 } 494 495 inline bool MarkedBlock::isMarked(HeapVersion heapVersion, const void* p)496 { 497 return needsFlip(heapVersion) ? false : m_marks.get(atomNumber(p));498 } 499 500 inline bool MarkedBlock::isMarkedConcurrently(HeapVersion heapVersion, const void* p)501 { 502 if ( needsFlip(heapVersion))490 inline void MarkedBlock::Handle::assertMarksNotStale() 491 { 492 block().assertMarksNotStale(); 493 } 494 495 inline bool MarkedBlock::isMarked(HeapVersion markingVersion, const void* p) 496 { 497 return areMarksStale(markingVersion) ? false : m_marks.get(atomNumber(p)); 498 } 499 500 inline bool MarkedBlock::isMarkedConcurrently(HeapVersion markingVersion, const void* p) 501 { 502 if (areMarksStale(markingVersion)) 503 503 return false; 504 504 WTF::loadLoadFence(); … … 508 508 inline bool MarkedBlock::testAndSetMarked(const void* p) 509 509 { 510 assert Flipped();510 assertMarksNotStale(); 511 511 return m_marks.concurrentTestAndSet(atomNumber(p)); 512 512 } … … 536 536 } 537 537 538 inline bool MarkedBlock::Handle::isMarkedOrNewlyAllocated(HeapVersion version, const HeapCell* cell)539 { 540 return m_block->isMarked( version, cell) || (m_newlyAllocated && isNewlyAllocated(cell));541 } 542 543 inline bool MarkedBlock::isMarkedOrNewlyAllocated(HeapVersion version, const HeapCell* cell)544 { 545 return isMarked( version, cell) || (m_handle.m_newlyAllocated && m_handle.isNewlyAllocated(cell));538 inline bool MarkedBlock::Handle::isMarkedOrNewlyAllocated(HeapVersion markingVersion, const HeapCell* cell) 539 { 540 return m_block->isMarked(markingVersion, cell) || (m_newlyAllocated && isNewlyAllocated(cell)); 541 } 542 543 inline bool MarkedBlock::isMarkedOrNewlyAllocated(HeapVersion markingVersion, const HeapCell* cell) 544 { 545 return isMarked(markingVersion, cell) || (m_handle.m_newlyAllocated && m_handle.isNewlyAllocated(cell)); 546 546 } 547 547 -
trunk/Source/JavaScriptCore/heap/MarkedBlockInlines.h
r206154 r206172 31 31 namespace JSC { 32 32 33 inline bool MarkedBlock::Handle::isLive(HeapVersion version, const HeapCell* cell)33 inline bool MarkedBlock::Handle::isLive(HeapVersion markingVersion, const HeapCell* cell) 34 34 { 35 35 ASSERT(!isFreeListed()); … … 45 45 return true; 46 46 47 if (block. needsFlip(version))47 if (block.areMarksStale(markingVersion)) 48 48 return false; 49 49 … … 51 51 } 52 52 53 inline bool MarkedBlock::Handle::isLiveCell(HeapVersion version, const void* p)53 inline bool MarkedBlock::Handle::isLiveCell(HeapVersion markingVersion, const void* p) 54 54 { 55 55 if (!m_block->isAtom(p)) 56 56 return false; 57 return isLive( version, static_cast<const HeapCell*>(p));57 return isLive(markingVersion, static_cast<const HeapCell*>(p)); 58 58 } 59 59 … … 88 88 } 89 89 90 inline void MarkedBlock::reset Version()90 inline void MarkedBlock::resetMarkingVersion() 91 91 { 92 m_ version = MarkedSpace::nullVersion;92 m_markingVersion = MarkedSpace::nullVersion; 93 93 } 94 94 -
trunk/Source/JavaScriptCore/heap/MarkedSpace.cpp
r206154 r206172 459 459 }); 460 460 461 m_ version = nextVersion(m_version);461 m_markingVersion = nextVersion(m_markingVersion); 462 462 463 if (UNLIKELY(m_ version == initialVersion)) {463 if (UNLIKELY(m_markingVersion == initialVersion)) { 464 464 // Oh no! Version wrap-around! We handle this by setting all block versions to null. 465 465 forEachBlock( 466 466 [&] (MarkedBlock::Handle* handle) { 467 handle->block().reset Version();467 handle->block().resetMarkingVersion(); 468 468 }); 469 469 } … … 476 476 forEachBlock( 477 477 [&] (MarkedBlock::Handle* block) { 478 if (block-> needsFlip())478 if (block->areMarksStale()) 479 479 return; 480 480 ASSERT(!block->isFreeListed()); -
trunk/Source/JavaScriptCore/heap/MarkedSpace.h
r206154 r206172 167 167 bool isPagedOut(double deadline); 168 168 169 HeapVersion version() const { return m_version; }169 HeapVersion markingVersion() const { return m_markingVersion; } 170 170 171 171 const Vector<LargeAllocation*>& largeAllocations() const { return m_largeAllocations; } … … 213 213 214 214 Heap* m_heap; 215 HeapVersion m_ version { initialVersion };215 HeapVersion m_markingVersion { initialVersion }; 216 216 size_t m_capacity; 217 217 bool m_isIterating; -
trunk/Source/JavaScriptCore/heap/SlotVisitor.cpp
r206154 r206172 79 79 , m_visitCount(0) 80 80 , m_isInParallelMode(false) 81 , m_ version(MarkedSpace::initialVersion)81 , m_markingVersion(MarkedSpace::initialVersion) 82 82 , m_heap(heap) 83 83 #if !ASSERT_DISABLED … … 103 103 m_heapSnapshotBuilder = heapProfiler->activeSnapshotBuilder(); 104 104 105 m_ version = heap()->objectSpace().version();105 m_markingVersion = heap()->objectSpace().markingVersion(); 106 106 } 107 107 … … 135 135 ASSERT(!m_isCheckingForDefaultMarkViolation); 136 136 137 if (Heap::testAndSetMarked(m_ version, heapCell))137 if (Heap::testAndSetMarked(m_markingVersion, heapCell)) 138 138 return; 139 139 … … 201 201 ALWAYS_INLINE void SlotVisitor::setMarkedAndAppendToMarkStack(ContainerType& container, JSCell* cell) 202 202 { 203 container.aboutToMark(m_ version);203 container.aboutToMark(m_markingVersion); 204 204 205 205 if (container.testAndSetMarked(cell)) … … 249 249 ASSERT(cell->heap() == heap()); 250 250 251 if (Heap::testAndSetMarked(m_ version, cell))251 if (Heap::testAndSetMarked(m_markingVersion, cell)) 252 252 return; 253 253 -
trunk/Source/JavaScriptCore/heap/SlotVisitor.h
r205850 r206172 125 125 bool isBuildingHeapSnapshot() const { return !!m_heapSnapshotBuilder; } 126 126 127 HeapVersion version() const { return m_version; }127 HeapVersion markingVersion() const { return m_markingVersion; } 128 128 129 129 private: … … 162 162 bool m_isInParallelMode; 163 163 164 HeapVersion m_ version;164 HeapVersion m_markingVersion; 165 165 166 166 Heap& m_heap; -
trunk/Source/JavaScriptCore/heap/WeakBlock.cpp
r206154 r206172 102 102 SlotVisitor& visitor = heapRootVisitor.visitor(); 103 103 104 HeapVersion version = visitor.version();104 HeapVersion markingVersion = visitor.markingVersion(); 105 105 106 106 for (size_t i = 0; i < weakImplCount(); ++i) { … … 114 114 115 115 const JSValue& jsValue = weakImpl->jsValue(); 116 if (container.isMarkedConcurrently( version, jsValue.asCell()))116 if (container.isMarkedConcurrently(markingVersion, jsValue.asCell())) 117 117 continue; 118 118 … … 148 148 ASSERT(m_container); 149 149 150 HeapVersion version = m_container.heap()->objectSpace().version();150 HeapVersion markingVersion = m_container.heap()->objectSpace().markingVersion(); 151 151 152 152 for (size_t i = 0; i < weakImplCount(); ++i) { … … 155 155 continue; 156 156 157 if (m_container.isMarked( version, weakImpl->jsValue().asCell())) {157 if (m_container.isMarked(markingVersion, weakImpl->jsValue().asCell())) { 158 158 ASSERT(weakImpl->state() == WeakImpl::Live); 159 159 continue;
Note: See TracChangeset
for help on using the changeset viewer.