Title: [283046] trunk/Source
Revision
283046
Author
[email protected]
Date
2021-09-24 10:31:26 -0700 (Fri, 24 Sep 2021)

Log Message

RTCDataChannelHandlerClient does not need to be ref counted
https://bugs.webkit.org/show_bug.cgi?id=230679

Reviewed by Eric Carlson.

Source/WebCore:

We can move from using a protected ref counted client to using a WeakPtr client
as we always hop to the client's thread before accessing it.
This reduces ref counting and simplifies lifetime management.

* Modules/mediastream/RTCDataChannel.h:
* Modules/mediastream/RTCDataChannelRemoteSource.h:
* Modules/mediastream/libwebrtc/LibWebRTCDataChannelHandler.cpp:
(WebCore::LibWebRTCDataChannelHandler::setClient):
(WebCore::LibWebRTCDataChannelHandler::checkState):
(WebCore::LibWebRTCDataChannelHandler::OnMessage):
(WebCore::LibWebRTCDataChannelHandler::OnBufferedAmountChange):
* Modules/mediastream/libwebrtc/LibWebRTCDataChannelHandler.h:
* platform/mediastream/RTCDataChannelHandlerClient.h:

Source/WebKit:

Move to UniqueRef now that it is no longer ref counted.

* WebProcess/Network/webrtc/RTCDataChannelRemoteManager.cpp:
(WebKit::RTCDataChannelRemoteManager::connectToRemoteSource):
* WebProcess/Network/webrtc/RTCDataChannelRemoteManager.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (283045 => 283046)


--- trunk/Source/WebCore/ChangeLog	2021-09-24 16:45:54 UTC (rev 283045)
+++ trunk/Source/WebCore/ChangeLog	2021-09-24 17:31:26 UTC (rev 283046)
@@ -1,3 +1,24 @@
+2021-09-24  Youenn Fablet  <[email protected]>
+
+        RTCDataChannelHandlerClient does not need to be ref counted
+        https://bugs.webkit.org/show_bug.cgi?id=230679
+
+        Reviewed by Eric Carlson.
+
+        We can move from using a protected ref counted client to using a WeakPtr client
+        as we always hop to the client's thread before accessing it.
+        This reduces ref counting and simplifies lifetime management.
+
+        * Modules/mediastream/RTCDataChannel.h:
+        * Modules/mediastream/RTCDataChannelRemoteSource.h:
+        * Modules/mediastream/libwebrtc/LibWebRTCDataChannelHandler.cpp:
+        (WebCore::LibWebRTCDataChannelHandler::setClient):
+        (WebCore::LibWebRTCDataChannelHandler::checkState):
+        (WebCore::LibWebRTCDataChannelHandler::OnMessage):
+        (WebCore::LibWebRTCDataChannelHandler::OnBufferedAmountChange):
+        * Modules/mediastream/libwebrtc/LibWebRTCDataChannelHandler.h:
+        * platform/mediastream/RTCDataChannelHandlerClient.h:
+
 2021-09-24  Alan Bujtas  <[email protected]>
 
         [LFC][IFC] Line::Run only needs a handful of style properties

Modified: trunk/Source/WebCore/Modules/mediastream/RTCDataChannel.h (283045 => 283046)


--- trunk/Source/WebCore/Modules/mediastream/RTCDataChannel.h	2021-09-24 16:45:54 UTC (rev 283045)
+++ trunk/Source/WebCore/Modules/mediastream/RTCDataChannel.h	2021-09-24 17:31:26 UTC (rev 283046)
@@ -50,7 +50,7 @@
 class Blob;
 class RTCPeerConnectionHandler;
 
-class RTCDataChannel final : public ActiveDOMObject, public RTCDataChannelHandlerClient, public EventTargetWithInlineData {
+class RTCDataChannel final : public RefCounted<RTCDataChannel>, public ActiveDOMObject, public RTCDataChannelHandlerClient, public EventTargetWithInlineData {
     WTF_MAKE_ISO_ALLOCATED(RTCDataChannel);
 public:
     static Ref<RTCDataChannel> create(ScriptExecutionContext&, std::unique_ptr<RTCDataChannelHandler>&&, String&&, RTCDataChannelInit&&);
@@ -85,8 +85,8 @@
     bool canDetach() const;
     std::unique_ptr<DetachedRTCDataChannel> detach();
 
-    using RTCDataChannelHandlerClient::ref;
-    using RTCDataChannelHandlerClient::deref;
+    using RefCounted<RTCDataChannel>::ref;
+    using RefCounted<RTCDataChannel>::deref;
 
     WEBCORE_EXPORT static std::unique_ptr<RTCDataChannelHandler> handlerFromIdentifier(RTCDataChannelLocalIdentifier);
 

Modified: trunk/Source/WebCore/Modules/mediastream/RTCDataChannelRemoteSource.h (283045 => 283046)


--- trunk/Source/WebCore/Modules/mediastream/RTCDataChannelRemoteSource.h	2021-09-24 16:45:54 UTC (rev 283045)
+++ trunk/Source/WebCore/Modules/mediastream/RTCDataChannelRemoteSource.h	2021-09-24 17:31:26 UTC (rev 283046)
@@ -36,8 +36,9 @@
 namespace WebCore {
 
 class RTCDataChannelRemoteSource : public RTCDataChannelHandlerClient {
+    WTF_MAKE_FAST_ALLOCATED;
 public:
-    static Ref<RTCDataChannelRemoteSource> create(RTCDataChannelIdentifier identifier, UniqueRef<RTCDataChannelHandler>&& handler, Ref<RTCDataChannelRemoteSourceConnection>&& connection) { return adoptRef(*new RTCDataChannelRemoteSource(identifier, WTFMove(handler), WTFMove(connection))); }
+    WEBCORE_EXPORT RTCDataChannelRemoteSource(RTCDataChannelIdentifier, UniqueRef<RTCDataChannelHandler>&&, Ref<RTCDataChannelRemoteSourceConnection>&&);
     ~RTCDataChannelRemoteSource();
 
     void sendStringData(const CString& text) { m_handler->sendStringData(text); }
@@ -45,7 +46,6 @@
     void close() { m_handler->close(); }
 
 private:
-    WEBCORE_EXPORT RTCDataChannelRemoteSource(RTCDataChannelIdentifier, UniqueRef<RTCDataChannelHandler>&&, Ref<RTCDataChannelRemoteSourceConnection>&&);
 
     // RTCDataChannelHandlerClient
     void didChangeReadyState(RTCDataChannelState state) final { m_connection->didChangeReadyState(m_identifier, state); }

Modified: trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCDataChannelHandler.cpp (283045 => 283046)


--- trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCDataChannelHandler.cpp	2021-09-24 16:45:54 UTC (rev 283045)
+++ trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCDataChannelHandler.cpp	2021-09-24 17:31:26 UTC (rev 283046)
@@ -91,7 +91,9 @@
 {
     Locker locker { m_clientLock };
     ASSERT(!m_client);
-    m_client = &client;
+    ASSERT(!m_hasClient);
+    m_hasClient = true;
+    m_client = makeWeakPtr(client);
     m_contextIdentifier = contextIdentifier;
 
     for (auto& message : m_bufferedMessages) {
@@ -151,18 +153,20 @@
     }
 
     Locker locker { m_clientLock };
-    if (!m_client) {
+    if (!m_hasClient) {
         m_bufferedMessages.append(StateChange { state, WTFMove(error) });
         return;
     }
-    postTask([protectedClient = Ref { *m_client }, state, error = WTFMove(error)] {
+    postTask([client = m_client, state, error = WTFMove(error)] {
+        if (!client)
+            return;
         if (error && !error->ok()) {
             auto rtcError = toRTCError(*error);
             if (!rtcError)
                 rtcError = RTCError::create(RTCError::Init { RTCErrorDetailType::DataChannelFailure, { }, { }, { }, { } }, String { });
-            protectedClient->didDetectError(rtcError.releaseNonNull());
+            client->didDetectError(rtcError.releaseNonNull());
         }
-        protectedClient->didChangeReadyState(state);
+        client->didChangeReadyState(state);
     });
 }
 
@@ -169,7 +173,7 @@
 void LibWebRTCDataChannelHandler::OnMessage(const webrtc::DataBuffer& buffer)
 {
     Locker locker { m_clientLock };
-    if (!m_client) {
+    if (!m_hasClient) {
         auto* data = ""
         if (buffer.binary)
             m_bufferedMessages.append(SharedBuffer::create(data, buffer.size()));
@@ -179,12 +183,15 @@
     }
 
     std::unique_ptr<webrtc::DataBuffer> protectedBuffer(new webrtc::DataBuffer(buffer));
-    postTask([protectedClient = Ref { *m_client }, buffer = WTFMove(protectedBuffer)] {
+    postTask([client = m_client, buffer = WTFMove(protectedBuffer)] {
+        if (!client)
+            return;
+
         auto* data = ""
         if (buffer->binary)
-            protectedClient->didReceiveRawData(data, buffer->size());
+            client->didReceiveRawData(data, buffer->size());
         else
-            protectedClient->didReceiveStringData(String::fromUTF8(data, buffer->size()));
+            client->didReceiveStringData(String::fromUTF8(data, buffer->size()));
     });
 }
 
@@ -191,11 +198,12 @@
 void LibWebRTCDataChannelHandler::OnBufferedAmountChange(uint64_t amount)
 {
     Locker locker { m_clientLock };
-    if (!m_client)
+    if (!m_hasClient)
         return;
 
-    postTask([protectedClient = Ref { *m_client }, amount] {
-        protectedClient->bufferedAmountIsDecreasing(static_cast<size_t>(amount));
+    postTask([client = m_client, amount] {
+        if (client)
+            client->bufferedAmountIsDecreasing(static_cast<size_t>(amount));
     });
 }
 

Modified: trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCDataChannelHandler.h (283045 => 283046)


--- trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCDataChannelHandler.h	2021-09-24 16:45:54 UTC (rev 283045)
+++ trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCDataChannelHandler.h	2021-09-24 17:31:26 UTC (rev 283046)
@@ -89,7 +89,8 @@
 
     rtc::scoped_refptr<webrtc::DataChannelInterface> m_channel;
     Lock m_clientLock;
-    RTCDataChannelHandlerClient* m_client WTF_GUARDED_BY_LOCK(m_clientLock) { nullptr };
+    bool m_hasClient WTF_GUARDED_BY_LOCK(m_clientLock)  { false };
+    WeakPtr<RTCDataChannelHandlerClient> m_client WTF_GUARDED_BY_LOCK(m_clientLock) { nullptr };
     ScriptExecutionContextIdentifier m_contextIdentifier;
     PendingMessages m_bufferedMessages WTF_GUARDED_BY_LOCK(m_clientLock);
 };

Modified: trunk/Source/WebCore/platform/mediastream/RTCDataChannelHandlerClient.h (283045 => 283046)


--- trunk/Source/WebCore/platform/mediastream/RTCDataChannelHandlerClient.h	2021-09-24 16:45:54 UTC (rev 283045)
+++ trunk/Source/WebCore/platform/mediastream/RTCDataChannelHandlerClient.h	2021-09-24 17:31:26 UTC (rev 283046)
@@ -29,6 +29,7 @@
 
 #include "RTCDataChannelState.h"
 #include <wtf/ThreadSafeRefCounted.h>
+#include <wtf/WeakPtr.h>
 #include <wtf/text/WTFString.h>
 
 namespace WebCore {
@@ -35,7 +36,7 @@
 
 class RTCError;
 
-class RTCDataChannelHandlerClient : public ThreadSafeRefCounted<RTCDataChannelHandlerClient> {
+class RTCDataChannelHandlerClient : public CanMakeWeakPtr<RTCDataChannelHandlerClient, WeakPtrFactoryInitialization::Eager> {
 public:
     virtual ~RTCDataChannelHandlerClient() = default;
 

Modified: trunk/Source/WebKit/ChangeLog (283045 => 283046)


--- trunk/Source/WebKit/ChangeLog	2021-09-24 16:45:54 UTC (rev 283045)
+++ trunk/Source/WebKit/ChangeLog	2021-09-24 17:31:26 UTC (rev 283046)
@@ -1,3 +1,16 @@
+2021-09-24  Youenn Fablet  <[email protected]>
+
+        RTCDataChannelHandlerClient does not need to be ref counted
+        https://bugs.webkit.org/show_bug.cgi?id=230679
+
+        Reviewed by Eric Carlson.
+
+        Move to UniqueRef now that it is no longer ref counted.
+
+        * WebProcess/Network/webrtc/RTCDataChannelRemoteManager.cpp:
+        (WebKit::RTCDataChannelRemoteManager::connectToRemoteSource):
+        * WebProcess/Network/webrtc/RTCDataChannelRemoteManager.h:
+
 2021-09-24  Per Arne Vollan  <[email protected]>
 
         Remove directory rule from sandboxes

Modified: trunk/Source/WebKit/WebProcess/Network/webrtc/RTCDataChannelRemoteManager.cpp (283045 => 283046)


--- trunk/Source/WebKit/WebProcess/Network/webrtc/RTCDataChannelRemoteManager.cpp	2021-09-24 16:45:54 UTC (rev 283045)
+++ trunk/Source/WebKit/WebProcess/Network/webrtc/RTCDataChannelRemoteManager.cpp	2021-09-24 17:31:26 UTC (rev 283046)
@@ -73,7 +73,7 @@
     if (!handler)
         return false;
 
-    auto iterator = m_sources.add(remoteIdentifier.channelIdentifier, WebCore::RTCDataChannelRemoteSource::create(remoteIdentifier, makeUniqueRefFromNonNullUniquePtr(WTFMove(handler)), remoteSourceConnection()));
+    auto iterator = m_sources.add(remoteIdentifier.channelIdentifier, makeUniqueRef<WebCore::RTCDataChannelRemoteSource>(remoteIdentifier, makeUniqueRefFromNonNullUniquePtr(WTFMove(handler)), remoteSourceConnection()));
     return iterator.isNewEntry;
 }
 

Modified: trunk/Source/WebKit/WebProcess/Network/webrtc/RTCDataChannelRemoteManager.h (283045 => 283046)


--- trunk/Source/WebKit/WebProcess/Network/webrtc/RTCDataChannelRemoteManager.h	2021-09-24 16:45:54 UTC (rev 283045)
+++ trunk/Source/WebKit/WebProcess/Network/webrtc/RTCDataChannelRemoteManager.h	2021-09-24 17:31:26 UTC (rev 283046)
@@ -104,7 +104,7 @@
     RefPtr<IPC::Connection> m_connection;
     RefPtr<RemoteHandlerConnection> m_remoteHandlerConnection;
     RefPtr<RemoteSourceConnection> m_remoteSourceConnection;
-    HashMap<WebCore::RTCDataChannelLocalIdentifier, Ref<WebCore::RTCDataChannelRemoteSource>> m_sources;
+    HashMap<WebCore::RTCDataChannelLocalIdentifier, UniqueRef<WebCore::RTCDataChannelRemoteSource>> m_sources;
     HashMap<WebCore::RTCDataChannelLocalIdentifier, RemoteHandler> m_handlers;
 };
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to