diff --git a/src/bun.js/bindings/webcore/MessagePort.cpp b/src/bun.js/bindings/webcore/MessagePort.cpp index 1cfb6c65a9..fc837005fa 100644 --- a/src/bun.js/bindings/webcore/MessagePort.cpp +++ b/src/bun.js/bindings/webcore/MessagePort.cpp @@ -87,16 +87,19 @@ bool MessagePort::isMessagePortAliveForTesting(const MessagePortIdentifier& iden void MessagePort::notifyMessageAvailable(const MessagePortIdentifier& identifier) { std::optional scriptExecutionContextIdentifier; - ThreadSafeWeakPtr weakPort; { Locker locker { allMessagePortsLock }; scriptExecutionContextIdentifier = portToContextIdentifier().getOptional(identifier); - weakPort = allMessagePorts().get(identifier); } if (!scriptExecutionContextIdentifier) return; - ScriptExecutionContext::ensureOnContextThread(*scriptExecutionContextIdentifier, [weakPort = WTFMove(weakPort)](auto&) { + ScriptExecutionContext::ensureOnContextThread(*scriptExecutionContextIdentifier, [identifier](auto&) { + ThreadSafeWeakPtr weakPort; + { + Locker locker { allMessagePortsLock }; + weakPort = allMessagePorts().get(identifier); + } if (RefPtr port = weakPort.get()) port->messageAvailable(); }); @@ -105,16 +108,19 @@ void MessagePort::notifyMessageAvailable(const MessagePortIdentifier& identifier void MessagePort::notifyPortClosed(const MessagePortIdentifier& identifier) { std::optional scriptExecutionContextIdentifier; - ThreadSafeWeakPtr weakPort; { Locker locker { allMessagePortsLock }; scriptExecutionContextIdentifier = portToContextIdentifier().getOptional(identifier); - weakPort = allMessagePorts().get(identifier); } if (!scriptExecutionContextIdentifier) return; - ScriptExecutionContext::ensureOnContextThread(*scriptExecutionContextIdentifier, [weakPort = WTFMove(weakPort)](auto&) { + ScriptExecutionContext::ensureOnContextThread(*scriptExecutionContextIdentifier, [identifier](auto&) { + ThreadSafeWeakPtr weakPort; + { + Locker locker { allMessagePortsLock }; + weakPort = allMessagePorts().get(identifier); + } if (RefPtr port = weakPort.get()) { // Only dispatch close event if the port has message event listeners if (port->m_hasMessageEventListener) {