Modified: trunk/Source/_javascript_Core/runtime/SamplingProfiler.cpp (278240 => 278241)
--- trunk/Source/_javascript_Core/runtime/SamplingProfiler.cpp 2021-05-29 16:59:52 UTC (rev 278240)
+++ trunk/Source/_javascript_Core/runtime/SamplingProfiler.cpp 2021-05-29 21:08:38 UTC (rev 278241)
@@ -75,13 +75,12 @@
class FrameWalker {
public:
- FrameWalker(VM& vm, CallFrame* callFrame, const AbstractLocker& codeBlockSetLocker, const AbstractLocker& machineThreadsLocker, const Optional<UncheckedLockHolder>& wasmCalleeLocker)
+ FrameWalker(VM& vm, CallFrame* callFrame, const AbstractLocker& codeBlockSetLocker, const AbstractLocker& machineThreadsLocker)
: m_vm(vm)
, m_callFrame(callFrame)
, m_entryFrame(vm.topEntryFrame)
, m_codeBlockSetLocker(codeBlockSetLocker)
, m_machineThreadsLocker(machineThreadsLocker)
- , m_wasmCalleeLocker(wasmCalleeLocker)
{
}
@@ -124,8 +123,9 @@
stackTrace[m_depth] = UnprocessedStackFrame(codeBlock, unsafeCallee, callSiteIndex);
#if ENABLE(WEBASSEMBLY)
if (Wasm::isSupported() && unsafeCallee.isWasm()) {
+ assertIsHeld(Wasm::CalleeRegistry::singleton().getLock());
auto* wasmCallee = unsafeCallee.asWasmCallee();
- if (Wasm::CalleeRegistry::singleton().isValidCallee(*m_wasmCalleeLocker, wasmCallee)) {
+ if (Wasm::CalleeRegistry::singleton().isValidCallee(wasmCallee)) {
// At this point, Wasm::Callee would be dying (ref count is 0), but its fields are still live.
// And we can safely copy Wasm::IndexOrName even when any lock is held by suspended threads.
stackTrace[m_depth].wasmIndexOrName = wasmCallee->indexOrName();
@@ -201,7 +201,6 @@
EntryFrame* m_entryFrame;
const AbstractLocker& m_codeBlockSetLocker;
const AbstractLocker& m_machineThreadsLocker;
- const Optional<UncheckedLockHolder>& m_wasmCalleeLocker;
bool m_bailingOut { false };
size_t m_depth { 0 };
};
@@ -210,8 +209,8 @@
public:
typedef FrameWalker Base;
- CFrameWalker(VM& vm, void* machineFrame, CallFrame* callFrame, const AbstractLocker& codeBlockSetLocker, const AbstractLocker& machineThreadsLocker, const Optional<UncheckedLockHolder>& wasmCalleeLocker)
- : Base(vm, callFrame, codeBlockSetLocker, machineThreadsLocker, wasmCalleeLocker)
+ CFrameWalker(VM& vm, void* machineFrame, CallFrame* callFrame, const AbstractLocker& codeBlockSetLocker, const AbstractLocker& machineThreadsLocker)
+ : Base(vm, callFrame, codeBlockSetLocker, machineThreadsLocker)
, m_machineFrame(machineFrame)
{
}
@@ -353,10 +352,10 @@
Locker machineThreadsLocker { m_vm.heap.machineThreads().getLock() };
Locker codeBlockSetLocker { m_vm.heap.codeBlockSet().getLock() };
Locker executableAllocatorLocker { ExecutableAllocator::singleton().getLock() };
- Optional<UncheckedLockHolder> wasmCalleesLocker;
+ Optional<LockHolder> wasmCalleesLocker;
#if ENABLE(WEBASSEMBLY)
if (Wasm::isSupported())
- wasmCalleesLocker = Locker { Wasm::CalleeRegistry::singleton().getLock() };
+ wasmCalleesLocker.emplace(Wasm::CalleeRegistry::singleton().getLock());
#endif
auto didSuspend = m_jscExecutionThread->suspend();
@@ -407,11 +406,11 @@
bool wasValidWalk;
bool didRunOutOfVectorSpace;
if (Options::sampleCCode()) {
- CFrameWalker walker(m_vm, machineFrame, callFrame, codeBlockSetLocker, machineThreadsLocker, wasmCalleesLocker);
+ CFrameWalker walker(m_vm, machineFrame, callFrame, codeBlockSetLocker, machineThreadsLocker);
walkSize = walker.walk(m_currentFrames, didRunOutOfVectorSpace);
wasValidWalk = walker.wasValidWalk();
} else {
- FrameWalker walker(m_vm, callFrame, codeBlockSetLocker, machineThreadsLocker, wasmCalleesLocker);
+ FrameWalker walker(m_vm, callFrame, codeBlockSetLocker, machineThreadsLocker);
walkSize = walker.walk(m_currentFrames, didRunOutOfVectorSpace);
wasValidWalk = walker.wasValidWalk();
}
Modified: trunk/Source/_javascript_Core/wasm/WasmCalleeRegistry.h (278240 => 278241)
--- trunk/Source/_javascript_Core/wasm/WasmCalleeRegistry.h 2021-05-29 16:59:52 UTC (rev 278240)
+++ trunk/Source/_javascript_Core/wasm/WasmCalleeRegistry.h 2021-05-29 21:08:38 UTC (rev 278241)
@@ -41,7 +41,7 @@
static void initialize();
static CalleeRegistry& singleton();
- UncheckedLock& getLock() { return m_lock; }
+ Lock& getLock() WTF_RETURNS_LOCK(m_lock) { return m_lock; }
void registerCallee(Callee* callee)
{
@@ -55,12 +55,12 @@
m_calleeSet.remove(callee);
}
- const HashSet<Callee*>& allCallees(const AbstractLocker&)
+ const HashSet<Callee*>& allCallees() WTF_REQUIRES_LOCK(m_lock)
{
return m_calleeSet;
}
- bool isValidCallee(const AbstractLocker&, Callee* callee)
+ bool isValidCallee(Callee* callee) WTF_REQUIRES_LOCK(m_lock)
{
if (!HashSet<Callee*>::isValidValue(callee))
return false;
@@ -70,8 +70,8 @@
CalleeRegistry() = default;
private:
- UncheckedLock m_lock;
- HashSet<Callee*> m_calleeSet;
+ Lock m_lock;
+ HashSet<Callee*> m_calleeSet WTF_GUARDED_BY_LOCK(m_lock);
};
} } // namespace JSC::Wasm
Modified: trunk/Source/_javascript_Core/wasm/WasmFaultSignalHandler.cpp (278240 => 278241)
--- trunk/Source/_javascript_Core/wasm/WasmFaultSignalHandler.cpp 2021-05-29 16:59:52 UTC (rev 278240)
+++ trunk/Source/_javascript_Core/wasm/WasmFaultSignalHandler.cpp 2021-05-29 21:08:38 UTC (rev 278241)
@@ -84,7 +84,7 @@
return true;
auto& calleeRegistry = CalleeRegistry::singleton();
Locker locker { calleeRegistry.getLock() };
- for (auto* callee : calleeRegistry.allCallees(locker)) {
+ for (auto* callee : calleeRegistry.allCallees()) {
auto [start, end] = callee->range();
dataLogLnIf(WasmFaultSignalHandlerInternal::verbose, "function start: ", RawPointer(start), " end: ", RawPointer(end));
if (start <= faultingInstruction && faultingInstruction < end) {