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;
};