Title: [293793] branches/safari-613-branch/Source/WebKit

Diff

Modified: branches/safari-613-branch/Source/WebKit/ChangeLog (293792 => 293793)


--- branches/safari-613-branch/Source/WebKit/ChangeLog	2022-05-04 21:23:43 UTC (rev 293792)
+++ branches/safari-613-branch/Source/WebKit/ChangeLog	2022-05-04 21:23:48 UTC (rev 293793)
@@ -1,3 +1,60 @@
+2022-05-04  Alan Coon  <alanc...@apple.com>
+
+        Apply patch. rdar://problem/88904160
+
+    2022-05-04  Kimmo Kinnunen  <kkinnu...@apple.com>
+
+            Multiple concurrency violations in LibWebRTCCodecsProxy
+            https://bugs.webkit.org/show_bug.cgi?id=236767
+            <rdar://88904160>
+
+            Reviewed by Antti Koivisto.
+
+            - ThreadMessageReceivers should not add IPC listeners in constructors,
+            as the delivery starts right away and uses the unconstructed virtual pointer.
+            - The work queue functions should not use GPUConnectionToWebProcess, as that is
+            main thread object.
+            - Locked m_encoders, m_decoders are sometimes accessed without lock.
+
+            Instead:
+            - Add the IPC listeners in initialize function.
+            - Remove the IPC listeners when GPUConnectionToWebProcess disconnects.
+            - Store the thread-safe conection, video frame object heap, process identity
+            objects as member variables.
+            - Do not lock m_encoders, m_decoders. If they are work queue instances,
+            just access them in the work queue functions. Add thread requirements
+            to the variables so that the compiler checks the access.
+            - Use IPC testing assertions when skipping incorrect messages.
+            - Use separate atomic counter (bool) to check if allowsExitUnderMemoryPressure.
+
+            No new tests, tested with existing tests and ASAN.
+
+            * GPUProcess/GPUConnectionToWebProcess.cpp:
+            (WebKit::GPUConnectionToWebProcess::~GPUConnectionToWebProcess):
+            (WebKit::GPUConnectionToWebProcess::didClose):
+            * GPUProcess/GPUConnectionToWebProcess.h:
+            * GPUProcess/webrtc/LibWebRTCCodecsProxy.h:
+            * GPUProcess/webrtc/LibWebRTCCodecsProxy.mm:
+            (WebKit::LibWebRTCCodecsProxy::create):
+            (WebKit::LibWebRTCCodecsProxy::LibWebRTCCodecsProxy):
+            (WebKit::LibWebRTCCodecsProxy::stopListeningForIPC):
+            (WebKit::LibWebRTCCodecsProxy::initialize):
+            (WebKit::LibWebRTCCodecsProxy::dispatchToThread):
+            (WebKit::LibWebRTCCodecsProxy::createDecoderCallback):
+            (WebKit::LibWebRTCCodecsProxy::createH264Decoder):
+            (WebKit::LibWebRTCCodecsProxy::createH265Decoder):
+            (WebKit::LibWebRTCCodecsProxy::createVP9Decoder):
+            (WebKit::LibWebRTCCodecsProxy::releaseDecoder):
+            (WebKit::LibWebRTCCodecsProxy::createEncoder):
+            (WebKit::LibWebRTCCodecsProxy::releaseEncoder):
+            (WebKit::LibWebRTCCodecsProxy::initializeEncoder):
+            (WebKit::LibWebRTCCodecsProxy::findEncoder):
+            (WebKit::LibWebRTCCodecsProxy::encodeFrame):
+            (WebKit::LibWebRTCCodecsProxy::setEncodeRates):
+            (WebKit::LibWebRTCCodecsProxy::setSharedVideoFrameSemaphore):
+            (WebKit::LibWebRTCCodecsProxy::setSharedVideoFrameMemory):
+            (WebKit::LibWebRTCCodecsProxy::allowsExitUnderMemoryPressure const):
+
 2022-05-02  Alan Coon  <alanc...@apple.com>
 
         Apply patch. rdar://problem/92617943

Modified: branches/safari-613-branch/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.cpp (293792 => 293793)


--- branches/safari-613-branch/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.cpp	2022-05-04 21:23:43 UTC (rev 293792)
+++ branches/safari-613-branch/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.cpp	2022-05-04 21:23:48 UTC (rev 293793)
@@ -274,9 +274,6 @@
 #if PLATFORM(COCOA) && ENABLE(MEDIA_STREAM)
     m_sampleBufferDisplayLayerManager->close();
 #endif
-#if PLATFORM(COCOA) && USE(LIBWEBRTC)
-    m_libWebRTCCodecsProxy->close();
-#endif
 
     --gObjectCountForTesting;
 }
@@ -309,7 +306,9 @@
         WCContentBufferManager::singleton().removeAllContentBuffersForProcess(webProcessIdentifier);
     });
 #endif
-
+#if PLATFORM(COCOA) && USE(LIBWEBRTC)
+    m_libWebRTCCodecsProxy = nullptr;
+#endif
     gpuProcess().connectionToWebProcessClosed(connection);
     gpuProcess().removeGPUConnectionToWebProcess(*this); // May destroy |this|.
 }

Modified: branches/safari-613-branch/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.h (293792 => 293793)


--- branches/safari-613-branch/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.h	2022-05-04 21:23:43 UTC (rev 293792)
+++ branches/safari-613-branch/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.h	2022-05-04 21:23:48 UTC (rev 293793)
@@ -285,7 +285,7 @@
     UniqueRef<RemoteMediaPlayerManagerProxy> m_remoteMediaPlayerManagerProxy;
     PAL::SessionID m_sessionID;
 #if PLATFORM(COCOA) && USE(LIBWEBRTC)
-    Ref<LibWebRTCCodecsProxy> m_libWebRTCCodecsProxy;
+    IPC::ScopedActiveMessageReceiveQueue<LibWebRTCCodecsProxy> m_libWebRTCCodecsProxy;
 #endif
 #if PLATFORM(COCOA) && ENABLE(MEDIA_STREAM)
     std::unique_ptr<UserMediaCaptureManagerProxy> m_userMediaCaptureManagerProxy;

Modified: branches/safari-613-branch/Source/WebKit/GPUProcess/graphics/RemoteGraphicsContextGL.cpp (293792 => 293793)


--- branches/safari-613-branch/Source/WebKit/GPUProcess/graphics/RemoteGraphicsContextGL.cpp	2022-05-04 21:23:43 UTC (rev 293792)
+++ branches/safari-613-branch/Source/WebKit/GPUProcess/graphics/RemoteGraphicsContextGL.cpp	2022-05-04 21:23:48 UTC (rev 293793)
@@ -255,7 +255,7 @@
 
 void RemoteGraphicsContextGL::copyTextureFromMedia(WebCore::MediaPlayerIdentifier mediaPlayerIdentifier, uint32_t texture, uint32_t target, int32_t level, uint32_t internalFormat, uint32_t format, uint32_t type, bool premultiplyAlpha, bool flipY, CompletionHandler<void(bool)>&& completionHandler)
 {
-    assertIsCurrent(m_streamThread);
+    assertIsCurrent(workQueue());
 #if USE(AVFOUNDATION)
     UNUSED_VARIABLE(premultiplyAlpha);
     ASSERT_UNUSED(target, target == GraphicsContextGL::TEXTURE_2D);

Modified: branches/safari-613-branch/Source/WebKit/GPUProcess/webrtc/LibWebRTCCodecsProxy.h (293792 => 293793)


--- branches/safari-613-branch/Source/WebKit/GPUProcess/webrtc/LibWebRTCCodecsProxy.h	2022-05-04 21:23:43 UTC (rev 293792)
+++ branches/safari-613-branch/Source/WebKit/GPUProcess/webrtc/LibWebRTCCodecsProxy.h	2022-05-04 21:23:48 UTC (rev 293793)
@@ -31,7 +31,9 @@
 #include "DataReference.h"
 #include "RTCDecoderIdentifier.h"
 #include "RTCEncoderIdentifier.h"
-#include <wtf/Lock.h>
+#include <WebCore/ProcessIdentity.h>
+#include <atomic>
+#include <wtf/ThreadAssertions.h>
 
 namespace IPC {
 class Connection;
@@ -51,18 +53,19 @@
 
 class GPUConnectionToWebProcess;
 
-class LibWebRTCCodecsProxy : public IPC::Connection::ThreadMessageReceiverRefCounted {
+class LibWebRTCCodecsProxy final : public IPC::Connection::ThreadMessageReceiverRefCounted {
     WTF_MAKE_FAST_ALLOCATED;
 public:
-    static Ref<LibWebRTCCodecsProxy> create(GPUConnectionToWebProcess& process) { return adoptRef(*new LibWebRTCCodecsProxy(process)); }
+    static Ref<LibWebRTCCodecsProxy> create(GPUConnectionToWebProcess&);
     ~LibWebRTCCodecsProxy();
-
-    void close();
-
+    void stopListeningForIPC(Ref<LibWebRTCCodecsProxy>&& refFromConnection);
     bool allowsExitUnderMemoryPressure() const;
 
 private:
     explicit LibWebRTCCodecsProxy(GPUConnectionToWebProcess&);
+    void initialize();
+    auto createDecoderCallback(RTCDecoderIdentifier);
+    WorkQueue& workQueue() const { return m_queue; }
 
     // IPC::Connection::ThreadMessageReceiver
     void dispatchToThread(Function<void()>&&) final;
@@ -85,13 +88,13 @@
 
     CFDictionaryRef ioSurfacePixelBufferCreationOptions(IOSurfaceRef);
 
-    GPUConnectionToWebProcess& m_gpuConnectionToWebProcess;
+    Ref<IPC::Connection> m_connection;
+    Ref<WorkQueue> m_queue;
+    const WebCore::ProcessIdentity m_resourceOwner;
 
-    mutable Lock m_lock;
-    HashMap<RTCDecoderIdentifier, webrtc::LocalDecoder> m_decoders WTF_GUARDED_BY_LOCK(m_lock); // Only modified on the libWebRTCCodecsQueue but may get accessed from the main thread.
-    HashMap<RTCEncoderIdentifier, webrtc::LocalEncoder> m_encoders WTF_GUARDED_BY_LOCK(m_lock); // Only modified on the libWebRTCCodecsQueue but may get accessed from the main thread.
-
-    Ref<WorkQueue> m_queue;
+    HashMap<RTCDecoderIdentifier, webrtc::LocalDecoder> m_decoders WTF_GUARDED_BY_LOCK(workQueue());
+    HashMap<RTCEncoderIdentifier, webrtc::LocalEncoder> m_encoders WTF_GUARDED_BY_LOCK(workQueue());
+    std::atomic<bool> m_hasEncodersOrDecoders { false };
 };
 
 }

Modified: branches/safari-613-branch/Source/WebKit/GPUProcess/webrtc/LibWebRTCCodecsProxy.mm (293792 => 293793)


--- branches/safari-613-branch/Source/WebKit/GPUProcess/webrtc/LibWebRTCCodecsProxy.mm	2022-05-04 21:23:43 UTC (rev 293792)
+++ branches/safari-613-branch/Source/WebKit/GPUProcess/webrtc/LibWebRTCCodecsProxy.mm	2022-05-04 21:23:48 UTC (rev 293793)
@@ -36,6 +36,7 @@
 #import <WebCore/CVUtilities.h>
 #import <WebCore/LibWebRTCProvider.h>
 #import <WebCore/RemoteVideoSample.h>
+#import <WebCore/MediaSampleAVFObjC.h>
 #import <webrtc/sdk/WebKit/WebKitDecoder.h>
 #import <webrtc/sdk/WebKit/WebKitEncoder.h>
 #import <wtf/BlockPtr.h>
@@ -43,28 +44,28 @@
 
 namespace WebKit {
 
-LibWebRTCCodecsProxy::LibWebRTCCodecsProxy(GPUConnectionToWebProcess& connection)
-    : m_gpuConnectionToWebProcess(connection)
-    , m_queue(connection.gpuProcess().libWebRTCCodecsQueue())
+Ref<LibWebRTCCodecsProxy> LibWebRTCCodecsProxy::create(GPUConnectionToWebProcess& webProcessConnection)
 {
-    m_gpuConnectionToWebProcess.connection().addThreadMessageReceiver(Messages::LibWebRTCCodecsProxy::messageReceiverName(), this);
+    auto instance = adoptRef(*new LibWebRTCCodecsProxy(webProcessConnection));
+    instance->initialize();
+    return instance;
 }
 
-LibWebRTCCodecsProxy::~LibWebRTCCodecsProxy()
+LibWebRTCCodecsProxy::LibWebRTCCodecsProxy(GPUConnectionToWebProcess& webProcessConnection)
+    : m_connection(webProcessConnection.connection())
+    , m_queue(webProcessConnection.gpuProcess().libWebRTCCodecsQueue())
+    , m_resourceOwner(webProcessConnection.webProcessIdentity())
 {
 }
 
-void LibWebRTCCodecsProxy::dispatchToThread(Function<void()>&& function)
-{
-    m_queue->dispatch(WTFMove(function));
-}
+LibWebRTCCodecsProxy::~LibWebRTCCodecsProxy() = default;
 
-void LibWebRTCCodecsProxy::close()
+void LibWebRTCCodecsProxy::stopListeningForIPC(Ref<LibWebRTCCodecsProxy>&& refFromConnection)
 {
-    m_gpuConnectionToWebProcess.connection().removeThreadMessageReceiver(Messages::LibWebRTCCodecsProxy::messageReceiverName());
+    m_connection->removeThreadMessageReceiver(Messages::LibWebRTCCodecsProxy::messageReceiverName());
 
-    dispatchToThread([this, protectedThis = Ref { *this }] {
-        Locker locker { m_lock };
+    dispatchToThread([this, protectedThis = WTFMove(refFromConnection)] {
+        assertIsCurrent(workQueue());
         auto decoders = WTFMove(m_decoders);
         for (auto decoder : decoders.values())
             webrtc::releaseLocalDecoder(decoder);
@@ -74,9 +75,19 @@
     });
 }
 
-static Function<void(CVPixelBufferRef pixelBuffer, uint32_t timeStampNs, uint32_t timeStamp)> createDecoderCallback(RTCDecoderIdentifier identifier, GPUConnectionToWebProcess& gpuConnectionToWebProcess)
+void LibWebRTCCodecsProxy::initialize()
 {
-    return [connection = Ref { gpuConnectionToWebProcess.connection() }, resourceOwner = gpuConnectionToWebProcess.webProcessIdentity(), identifier] (CVPixelBufferRef pixelBuffer, uint32_t timeStampNs, uint32_t timeStamp) {
+    m_connection->addThreadMessageReceiver(Messages::LibWebRTCCodecsProxy::messageReceiverName(), this);
+}
+
+void LibWebRTCCodecsProxy::dispatchToThread(Function<void()>&& function)
+{
+    m_queue->dispatch(WTFMove(function));
+}
+
+auto LibWebRTCCodecsProxy::createDecoderCallback(RTCDecoderIdentifier identifier)
+{
+    return [identifier, connection = m_connection, resourceOwner = m_resourceOwner] (CVPixelBufferRef pixelBuffer, uint32_t timeStampNs, uint32_t timeStamp) mutable {
         if (auto sample = WebCore::RemoteVideoSample::create(pixelBuffer, MediaTime(timeStampNs, 1))) {
             if (resourceOwner)
                 sample->setOwnershipIdentity(resourceOwner);
@@ -87,100 +98,89 @@
 
 void LibWebRTCCodecsProxy::createH264Decoder(RTCDecoderIdentifier identifier)
 {
-    ASSERT(!isMainRunLoop());
-    Locker locker { m_lock };
-    ASSERT(!m_decoders.contains(identifier));
-    m_decoders.add(identifier, webrtc::createLocalH264Decoder(makeBlockPtr(createDecoderCallback(identifier, m_gpuConnectionToWebProcess)).get()));
+    assertIsCurrent(workQueue());
+    auto result = m_decoders.add(identifier, webrtc::createLocalH264Decoder(makeBlockPtr(createDecoderCallback(identifier)).get()));
+    ASSERT_UNUSED(result, result.isNewEntry);
+    m_hasEncodersOrDecoders = true;
 }
 
 void LibWebRTCCodecsProxy::createH265Decoder(RTCDecoderIdentifier identifier)
 {
-    ASSERT(!isMainRunLoop());
-    Locker locker { m_lock };
-    ASSERT(!m_decoders.contains(identifier));
-    m_decoders.add(identifier, webrtc::createLocalH265Decoder(makeBlockPtr(createDecoderCallback(identifier, m_gpuConnectionToWebProcess)).get()));
+    assertIsCurrent(workQueue());
+    auto result = m_decoders.add(identifier, webrtc::createLocalH265Decoder(makeBlockPtr(createDecoderCallback(identifier)).get()));
+    ASSERT_UNUSED(result, result.isNewEntry);
+    m_hasEncodersOrDecoders = true;
 }
 
 void LibWebRTCCodecsProxy::createVP9Decoder(RTCDecoderIdentifier identifier)
 {
-    ASSERT(!isMainRunLoop());
-    Locker locker { m_lock };
-    ASSERT(!m_decoders.contains(identifier));
-    m_decoders.add(identifier, webrtc::createLocalVP9Decoder(makeBlockPtr(createDecoderCallback(identifier, m_gpuConnectionToWebProcess)).get()));
+    assertIsCurrent(workQueue());
+    auto result = m_decoders.add(identifier, webrtc::createLocalVP9Decoder(makeBlockPtr(createDecoderCallback(identifier)).get()));
+    ASSERT_UNUSED(result, result.isNewEntry);
+    m_hasEncodersOrDecoders = true;
 }
 
 void LibWebRTCCodecsProxy::releaseDecoder(RTCDecoderIdentifier identifier)
 {
-    ASSERT(!isMainRunLoop());
-    Locker locker { m_lock };
-    ASSERT(m_decoders.contains(identifier));
-    if (auto decoder = m_decoders.take(identifier))
-        webrtc::releaseLocalDecoder(decoder);
+    assertIsCurrent(workQueue());
+    auto decoder = m_decoders.take(identifier);
+    if (!decoder)
+        return;
+    webrtc::releaseLocalDecoder(decoder);
+    m_hasEncodersOrDecoders = !m_encoders.isEmpty() || !m_decoders.isEmpty();
 }
 
-// For performance reasons, this function accesses m_decoders without locking. This is safe because this function runs on the libWebRTCCodecsQueue
-// and m_decoders only get modified on this queue.
-void LibWebRTCCodecsProxy::decodeFrame(RTCDecoderIdentifier identifier, uint32_t timeStamp, const IPC::DataReference& data) WTF_IGNORES_THREAD_SAFETY_ANALYSIS
+void LibWebRTCCodecsProxy::decodeFrame(RTCDecoderIdentifier identifier, uint32_t timeStamp, const IPC::DataReference& data)
 {
-    ASSERT(!isMainRunLoop());
-    ASSERT(m_decoders.contains(identifier));
+    assertIsCurrent(workQueue());
     auto decoder = m_decoders.get(identifier);
     if (!decoder)
         return;
-
     if (webrtc::decodeFrame(decoder, timeStamp, data.data(), data.size()))
-        m_gpuConnectionToWebProcess.connection().send(Messages::LibWebRTCCodecs::FailedDecoding { identifier }, 0);
+        m_connection->send(Messages::LibWebRTCCodecs::FailedDecoding { identifier }, 0);
 }
 
-// For performance reasons, this function accesses m_decoders without locking. This is safe because this function runs on the libWebRTCCodecsQueue
-// and m_decoders only get modified on this queue.
-void LibWebRTCCodecsProxy::setFrameSize(RTCDecoderIdentifier identifier, uint16_t width, uint16_t height) WTF_IGNORES_THREAD_SAFETY_ANALYSIS
+void LibWebRTCCodecsProxy::setFrameSize(RTCDecoderIdentifier identifier, uint16_t width, uint16_t height)
 {
-    ASSERT(!isMainRunLoop());
-    ASSERT(m_decoders.contains(identifier));
+    assertIsCurrent(workQueue());
     auto decoder = m_decoders.get(identifier);
     if (!decoder)
         return;
-
     webrtc::setDecoderFrameSize(decoder, width, height);
 }
 
 void LibWebRTCCodecsProxy::createEncoder(RTCEncoderIdentifier identifier, const String& formatName, const Vector<std::pair<String, String>>& parameters, bool useLowLatency)
 {
-    ASSERT(!isMainRunLoop());
-    Locker locker { m_lock };
-    ASSERT(!m_encoders.contains(identifier));
-
+    assertIsCurrent(workQueue());
     std::map<std::string, std::string> rtcParameters;
     for (auto& parameter : parameters)
         rtcParameters.emplace(parameter.first.utf8().data(), parameter.second.utf8().data());
 
-    auto* encoder = webrtc::createLocalEncoder(webrtc::SdpVideoFormat { formatName.utf8().data(), rtcParameters }, makeBlockPtr([connection = Ref { m_gpuConnectionToWebProcess.connection() }, identifier](const uint8_t* buffer, size_t size, const webrtc::WebKitEncodedFrameInfo& info) {
+    auto* encoder = webrtc::createLocalEncoder(webrtc::SdpVideoFormat { formatName.utf8().data(), rtcParameters }, makeBlockPtr([connection = m_connection, identifier](const uint8_t* buffer, size_t size, const webrtc::WebKitEncodedFrameInfo& info) {
         connection->send(Messages::LibWebRTCCodecs::CompletedEncoding { identifier, IPC::DataReference { buffer, size }, info }, 0);
     }).get());
     webrtc::setLocalEncoderLowLatency(encoder, useLowLatency);
-    m_encoders.add(identifier, encoder);
+    auto result = m_encoders.add(identifier, encoder);
+    ASSERT_UNUSED(result, result.isNewEntry);
+    m_hasEncodersOrDecoders = true;
 }
 
 void LibWebRTCCodecsProxy::releaseEncoder(RTCEncoderIdentifier identifier)
 {
-    ASSERT(!isMainRunLoop());
-    Locker locker { m_lock };
-    ASSERT(m_encoders.contains(identifier));
-    if (auto encoder = m_encoders.take(identifier))
-        webrtc::releaseLocalEncoder(encoder);
+    assertIsCurrent(workQueue());
+    auto encoder = m_encoders.take(identifier);
+    if (!encoder)
+        return;
+    webrtc::releaseLocalEncoder(encoder);
+    m_hasEncodersOrDecoders = !m_encoders.isEmpty() || !m_decoders.isEmpty();
 }
 
-// For performance reasons, this function accesses m_encoders without locking. This is safe because this function runs on the libWebRTCCodecsQueue
-// and m_encoders only get modified on this queue.
-void LibWebRTCCodecsProxy::initializeEncoder(RTCEncoderIdentifier identifier, uint16_t width, uint16_t height, unsigned startBitrate, unsigned maxBitrate, unsigned minBitrate, uint32_t maxFramerate) WTF_IGNORES_THREAD_SAFETY_ANALYSIS
+void LibWebRTCCodecsProxy::initializeEncoder(RTCEncoderIdentifier identifier, uint16_t width, uint16_t height, unsigned startBitrate, unsigned maxBitrate, unsigned minBitrate, uint32_t maxFramerate)
 {
-    ASSERT(!isMainRunLoop());
-    ASSERT(m_encoders.contains(identifier));
+    assertIsCurrent(workQueue());
     auto encoder = m_encoders.get(identifier);
     if (!encoder)
         return;
-
     webrtc::initializeLocalEncoder(encoder, width, height, startBitrate, maxBitrate, minBitrate, maxFramerate);
 }
 
@@ -200,11 +200,9 @@
     return webrtc::kVideoRotation_0;
 }
 
-// For performance reasons, this function accesses m_encoders without locking. This is safe because this function runs on the libWebRTCCodecsQueue
-// and m_encoders only get modified on this queue.
-void LibWebRTCCodecsProxy::encodeFrame(RTCEncoderIdentifier identifier, WebCore::RemoteVideoSample&& sample, uint32_t timeStamp, bool shouldEncodeAsKeyFrame) WTF_IGNORES_THREAD_SAFETY_ANALYSIS
+void LibWebRTCCodecsProxy::encodeFrame(RTCEncoderIdentifier identifier, WebCore::RemoteVideoSample&& sample, uint32_t timeStamp, bool shouldEncodeAsKeyFrame)
 {
-    ASSERT(!isMainRunLoop());
+    assertIsCurrent(workQueue());
     ASSERT(m_encoders.contains(identifier));
     auto encoder = m_encoders.get(identifier);
     if (!encoder)
@@ -220,11 +218,9 @@
 #endif
 }
 
-// For performance reasons, this function accesses m_encoders without locking. This is safe because this function runs on the libWebRTCCodecsQueue
-// and m_encoders only get modified on this queue.
-void LibWebRTCCodecsProxy::setEncodeRates(RTCEncoderIdentifier identifier, uint32_t bitRate, uint32_t frameRate) WTF_IGNORES_THREAD_SAFETY_ANALYSIS
+void LibWebRTCCodecsProxy::setEncodeRates(RTCEncoderIdentifier identifier, uint32_t bitRate, uint32_t frameRate)
 {
-    ASSERT(!isMainRunLoop());
+    assertIsCurrent(workQueue());
     auto encoder = m_encoders.get(identifier);
     if (!encoder)
         return;
@@ -234,9 +230,8 @@
 
 bool LibWebRTCCodecsProxy::allowsExitUnderMemoryPressure() const
 {
-    ASSERT(isMainRunLoop());
-    Locker locker { m_lock };
-    return m_encoders.isEmpty() && m_decoders.isEmpty();
+    assertIsMainRunLoop();
+    return !m_hasEncodersOrDecoders;
 }
 
 void LibWebRTCCodecsProxy::setRTCLoggingLevel(WTFLogLevel level)
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to