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

Diff

Modified: branches/safari-613-branch/Source/WebKit/ChangeLog (293850 => 293851)


--- branches/safari-613-branch/Source/WebKit/ChangeLog	2022-05-05 18:35:55 UTC (rev 293850)
+++ branches/safari-613-branch/Source/WebKit/ChangeLog	2022-05-05 18:35:58 UTC (rev 293851)
@@ -4,6 +4,63 @@
 
     2022-04-22  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-05  Alan Coon  <alanc...@apple.com>
+
+        Apply patch. rdar://problem/88904160
+
+    2022-04-22  Kimmo Kinnunen  <kkinnu...@apple.com>
+
             Thread safety analysis to assert "code is run sequentially" is not useful when code is mainly run with WorkQueues
             https://bugs.webkit.org/show_bug.cgi?id=236832
 

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


--- branches/safari-613-branch/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.cpp	2022-05-05 18:35:55 UTC (rev 293850)
+++ branches/safari-613-branch/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.cpp	2022-05-05 18:35:58 UTC (rev 293851)
@@ -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 (293850 => 293851)


--- branches/safari-613-branch/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.h	2022-05-05 18:35:55 UTC (rev 293850)
+++ branches/safari-613-branch/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.h	2022-05-05 18:35:58 UTC (rev 293851)
@@ -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/webrtc/LibWebRTCCodecsProxy.h (293850 => 293851)


--- branches/safari-613-branch/Source/WebKit/GPUProcess/webrtc/LibWebRTCCodecsProxy.h	2022-05-05 18:35:55 UTC (rev 293850)
+++ branches/safari-613-branch/Source/WebKit/GPUProcess/webrtc/LibWebRTCCodecsProxy.h	2022-05-05 18:35:58 UTC (rev 293851)
@@ -31,7 +31,8 @@
 #include "DataReference.h"
 #include "RTCDecoderIdentifier.h"
 #include "RTCEncoderIdentifier.h"
-#include <wtf/Lock.h>
+#include <atomic>
+#include <wtf/ThreadAssertions.h>
 
 namespace IPC {
 class Connection;
@@ -51,18 +52,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, bool useRemoteFrames);
+    WorkQueue& workQueue() const { return m_queue; }
 
     // IPC::Connection::ThreadMessageReceiver
     void dispatchToThread(Function<void()>&&) final;
@@ -85,13 +87,11 @@
 
     CFDictionaryRef ioSurfacePixelBufferCreationOptions(IOSurfaceRef);
 
-    GPUConnectionToWebProcess& m_gpuConnectionToWebProcess;
 
-    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 (293850 => 293851)


--- branches/safari-613-branch/Source/WebKit/GPUProcess/webrtc/LibWebRTCCodecsProxy.mm	2022-05-05 18:35:55 UTC (rev 293850)
+++ branches/safari-613-branch/Source/WebKit/GPUProcess/webrtc/LibWebRTCCodecsProxy.mm	2022-05-05 18:35:58 UTC (rev 293851)
@@ -30,6 +30,7 @@
 
 #import "GPUConnectionToWebProcess.h"
 #import "GPUProcess.h"
+#import "IPCTester.h"
 #import "LibWebRTCCodecsMessages.h"
 #import "LibWebRTCCodecsProxyMessages.h"
 #import "WebCoreArgumentCoders.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,114 +75,124 @@
     });
 }
 
-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) {
-        if (auto sample = WebCore::RemoteVideoSample::create(pixelBuffer, MediaTime(timeStampNs, 1))) {
-            if (resourceOwner)
-                sample->setOwnershipIdentity(resourceOwner);
-            connection->send(Messages::LibWebRTCCodecs::CompletedDecoding { identifier, timeStamp, *sample }, 0);
-        }
+    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 {
+        auto sample = WebCore::MediaSampleAVFObjC::createImageSample(pixelBuffer, WebCore::MediaSample::VideoRotation::None, false, MediaTime(timeStampNs, 1), { });
+        if (!sample)
+            return;
+        if (resourceOwner)
+            sample->setOwnershipIdentity(resourceOwner);
+        connection->send(Messages::LibWebRTCCodecs::CompletedDecoding { identifier, timeStamp, *sample }, 0);
     };
 }
 
 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 || isTestingIPC());
+    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 || isTestingIPC());
+    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 || isTestingIPC());
+    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) {
+        ASSERT_IS_TESTING_IPC();
+        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)
+    if (!decoder) {
+        ASSERT_IS_TESTING_IPC();
         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)
+    if (!decoder) {
+        ASSERT_IS_TESTING_IPC();
         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 { encoder, nullptr });
+    ASSERT_UNUSED(result, result.isNewEntry || isTestingIPC());
+    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.webrtcEncoder) {
+        ASSERT_IS_TESTING_IPC();
+        return;
+    }
+    webrtc::releaseLocalEncoder(encoder.webrtcEncoder);
+    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));
-    auto encoder = m_encoders.get(identifier);
-    if (!encoder)
+    assertIsCurrent(workQueue());
+    auto* encoder = findEncoder(identifier);
+    if (!encoder) {
+        ASSERT_IS_TESTING_IPC();
         return;
-
-    webrtc::initializeLocalEncoder(encoder, width, height, startBitrate, maxBitrate, minBitrate, maxFramerate);
+    }
+    webrtc::initializeLocalEncoder(encoder->webrtcEncoder, width, height, startBitrate, maxBitrate, minBitrate, maxFramerate);
 }
 
 static inline webrtc::VideoRotation toWebRTCVideoRotation(WebCore::MediaSample::VideoRotation rotation)
@@ -200,11 +211,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 +229,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 +241,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