Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 58b937859832c12a4df62a2486ee23ccca6a5cb6
      
https://github.com/WebKit/WebKit/commit/58b937859832c12a4df62a2486ee23ccca6a5cb6
  Author: Keith Miller <[email protected]>
  Date:   2024-06-09 (Sun, 09 Jun 2024)

  Changed paths:
    M Source/JavaScriptCore/heap/BlockDirectory.cpp
    M Source/JavaScriptCore/heap/BlockDirectory.h
    M Source/JavaScriptCore/heap/BlockDirectoryBits.h
    M Source/JavaScriptCore/heap/BlockDirectoryInlines.h
    M Source/JavaScriptCore/heap/HeapIterationScope.h
    M Source/JavaScriptCore/heap/IncrementalSweeper.cpp
    M Source/JavaScriptCore/heap/IsoCellSet.cpp
    M Source/JavaScriptCore/heap/IsoCellSetInlines.h
    M Source/JavaScriptCore/heap/LocalAllocator.cpp
    M Source/JavaScriptCore/heap/MarkedBlock.cpp
    M Source/JavaScriptCore/heap/MarkedBlock.h
    M Source/JavaScriptCore/heap/MarkedBlockInlines.h
    M Source/JavaScriptCore/heap/MarkedSpace.cpp

  Log Message:
  -----------
  [JSC] Add Concurrent Sweeping Locking
https://bugs.webkit.org/show_bug.cgi?id=275085
rdar://problem/129194601

Reviewed by Yusuke Suzuki.

This patch updates the various parts needed for BlockDirectory to work with
concurrent sweeping.

To make sure the future sweeper thread and the mutator don't clobber each other 
this patch
adds a new bit to BlockDirectory that tracks when a MarkedBlock is "in use". 
Being in
use means that the MarkedBlock is actively being swept or allocated out of. 
Additionally,
we need to make sure that we don't see a tear when updating the BlockDirectory 
bits. This is done by
holding the BlockDirectory's bit vector lock when reading/writing the following 
bit fields:

1) empty
2) destructable
3) unswept
4) inUse

To help make the locking mechanism for BlockDirectoryBits more clear this patch 
adds support for
Clang's thread safety analysis tooling with some special tricks for 
reading/writing. Specifically,
this patch adds assertIsMutatorOrMutatorIsStopped that tells the thread safety 
analysis m_bitvectorLock
is acquired in as a shared lock (despite m_bitvectorLock being an exclusive 
lock) when reading from m_bits is
race-safe. The read-only accessors for m_bits take the "shared" lock so Clang 
is happy. For cases where
writing is race-free there is assertSweeperIsSuspended which "assert acquires" 
m_bitvectorLock and allows
access to the mutating accessors of m_bits.

Note, the concurrent sweeper doesn't sweep weak blocks because it's not thread 
safe to do so.
This is ok though because when the main thread goes to allocate out of a marked 
block it always does
another sweep to build the free list, which will clear these weak impls.

Lastly, this patch adds an assertion to HeapIterationScope that the current 
thread is holding the API
lock. It's expected the JS isn't running concurrently to HeapIterationScope so 
this shouldn't be an
issue.

* Source/JavaScriptCore/heap/BlockDirectory.cpp:
(JSC::BlockDirectory::findEmptyBlockToSteal):
(JSC::BlockDirectory::findBlockForAllocation):
(JSC::BlockDirectory::tryAllocateBlock):
(JSC::BlockDirectory::addBlock):
(JSC::BlockDirectory::removeBlock):
(JSC::BlockDirectory::stopAllocating):
(JSC::BlockDirectory::prepareForAllocation):
(JSC::BlockDirectory::stopAllocatingForGood):
(JSC::BlockDirectory::resumeAllocating):
(JSC::BlockDirectory::beginMarkingForFullCollection):
(JSC::BlockDirectory::endMarking):
(JSC::BlockDirectory::snapshotUnsweptForEdenCollection):
(JSC::BlockDirectory::snapshotUnsweptForFullCollection):
(JSC::BlockDirectory::findBlockToSweep):
(JSC::BlockDirectory::sweep):
(JSC::BlockDirectory::shrink):
(JSC::BlockDirectory::assertNoUnswept):
(JSC::BlockDirectory::didFinishUsingBlock):
(JSC::BlockDirectory::parallelNotEmptyBlockSource):
(JSC::BlockDirectory::dumpBits):
(JSC::BlockDirectory::assertIsMutatorOrMutatorIsStopped const):
(JSC::BlockDirectory::assertSweeperIsSuspended const):
* Source/JavaScriptCore/heap/BlockDirectory.h:
(JSC::BlockDirectory::WTF_ASSERTS_ACQUIRED_SHARED_LOCK):
(JSC::BlockDirectory::WTF_ASSERTS_ACQUIRED_LOCK):
(JSC::BlockDirectory::WTF_REQUIRES_LOCK):
(JSC::BlockDirectory::WTF_REQUIRES_SHARED_LOCK):
(JSC::BlockDirectory::findBlockToSweep):
(JSC::BlockDirectory::forEachBitVector): Deleted.
(JSC::BlockDirectory::forEachBitVectorWithName): Deleted.
* Source/JavaScriptCore/heap/BlockDirectoryBits.h:
* Source/JavaScriptCore/heap/BlockDirectoryInlines.h:
(JSC::BlockDirectory::forEachBlock):
(JSC::BlockDirectory::forEachNotEmptyBlock):
* Source/JavaScriptCore/heap/HeapIterationScope.h:
(JSC::HeapIterationScope::HeapIterationScope):
* Source/JavaScriptCore/heap/IncrementalSweeper.cpp:
(JSC::IncrementalSweeper::sweepNextBlock):
* Source/JavaScriptCore/heap/IsoCellSet.cpp:
(JSC::IsoCellSet::parallelNotEmptyMarkedBlockSource):
* Source/JavaScriptCore/heap/IsoCellSetInlines.h:
(JSC::IsoCellSet::forEachMarkedCell):
* Source/JavaScriptCore/heap/LocalAllocator.cpp:
(JSC::LocalAllocator::tryAllocateIn):
* Source/JavaScriptCore/heap/MarkedBlock.cpp:
(JSC::MarkedBlock::Handle::unsweepWithNoNewlyAllocated):
(JSC::MarkedBlock::Handle::stopAllocating):
(JSC::MarkedBlock::Handle::lastChanceToFinalize):
(JSC::MarkedBlock::Handle::resumeAllocating):
(JSC::MarkedBlock::aboutToMarkSlow):
(JSC::MarkedBlock::Handle::didConsumeFreeList):
(JSC::MarkedBlock::noteMarkedSlow):
(JSC::MarkedBlock::Handle::dumpState):
(JSC::MarkedBlock::Handle::sweep):
* Source/JavaScriptCore/heap/MarkedBlock.h:
* Source/JavaScriptCore/heap/MarkedBlockInlines.h:
(JSC::MarkedBlock::Handle::isAllocated):
(JSC::MarkedBlock::Handle::isLive):
(JSC::MarkedBlock::Handle::specializedSweep):
(JSC::MarkedBlock::Handle::isEmpty):
(JSC::MarkedBlock::Handle::setIsFreeListed): Deleted.
* Source/JavaScriptCore/heap/MarkedSpace.cpp:
(JSC::MarkedSpace::dumpBits):
* Source/JavaScriptCore/inspector/agents/InspectorDebuggerAgent.cpp:
(Inspector::InspectorDebuggerAgent::addSymbolicBreakpoint):
* Source/JavaScriptCore/llint/LLIntOffsetsExtractor.cpp:
* Source/WebCore/page/PerformanceLogging.cpp:

Canonical link: https://commits.webkit.org/279861@main



To unsubscribe from these emails, change your notification settings at 
https://github.com/WebKit/WebKit/settings/notifications
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to