Changeset 263670 in webkit


Ignore:
Timestamp:
Jun 29, 2020 11:27:54 AM (4 years ago)
Author:
youenn@apple.com
Message:

Send WebRTC packets received from network process to web process from a background thread
https://bugs.webkit.org/show_bug.cgi?id=213548

Reviewed by Eric Carlson.

Make LibWebRTCSocketClient take a ref to an IPC connection at creation time.
Use this connection from the RTC network thread to send received packets to improve performances.
Covered by existing tests.

  • NetworkProcess/webrtc/LibWebRTCSocketClient.cpp:

(WebKit::LibWebRTCSocketClient::LibWebRTCSocketClient):
(WebKit::LibWebRTCSocketClient::signalReadPacket):
(WebKit::LibWebRTCSocketClient::signalSentPacket):
(WebKit::LibWebRTCSocketClient::signalAddressReady):
(WebKit::LibWebRTCSocketClient::signalConnect):
(WebKit::LibWebRTCSocketClient::signalClose):

  • NetworkProcess/webrtc/LibWebRTCSocketClient.h:
  • NetworkProcess/webrtc/NetworkRTCProvider.cpp:

(WebKit::NetworkRTCProvider::createSocket):
(WebKit::NetworkRTCProvider::createUDPSocket):
(WebKit::NetworkRTCProvider::createServerTCPSocket):
(WebKit::NetworkRTCProvider::createClientTCPSocket):
(WebKit::NetworkRTCProvider::wrapNewTCPConnection):

  • NetworkProcess/webrtc/NetworkRTCProvider.h:
Location:
trunk/Source/WebKit
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/ChangeLog

    r263652 r263670  
     12020-06-29  Youenn Fablet  <youenn@apple.com>
     2
     3        Send WebRTC packets received from network process to web process from a background thread
     4        https://bugs.webkit.org/show_bug.cgi?id=213548
     5
     6        Reviewed by Eric Carlson.
     7
     8        Make LibWebRTCSocketClient take a ref to an IPC connection at creation time.
     9        Use this connection from the RTC network thread to send received packets to improve performances.
     10        Covered by existing tests.
     11
     12        * NetworkProcess/webrtc/LibWebRTCSocketClient.cpp:
     13        (WebKit::LibWebRTCSocketClient::LibWebRTCSocketClient):
     14        (WebKit::LibWebRTCSocketClient::signalReadPacket):
     15        (WebKit::LibWebRTCSocketClient::signalSentPacket):
     16        (WebKit::LibWebRTCSocketClient::signalAddressReady):
     17        (WebKit::LibWebRTCSocketClient::signalConnect):
     18        (WebKit::LibWebRTCSocketClient::signalClose):
     19        * NetworkProcess/webrtc/LibWebRTCSocketClient.h:
     20        * NetworkProcess/webrtc/NetworkRTCProvider.cpp:
     21        (WebKit::NetworkRTCProvider::createSocket):
     22        (WebKit::NetworkRTCProvider::createUDPSocket):
     23        (WebKit::NetworkRTCProvider::createServerTCPSocket):
     24        (WebKit::NetworkRTCProvider::createClientTCPSocket):
     25        (WebKit::NetworkRTCProvider::wrapNewTCPConnection):
     26        * NetworkProcess/webrtc/NetworkRTCProvider.h:
     27
    1282020-06-29  Elliot  <CheeseEBoi@mailo.com>
    229
  • trunk/Source/WebKit/NetworkProcess/webrtc/LibWebRTCSocketClient.cpp

    r263272 r263670  
    3939namespace WebKit {
    4040
    41 LibWebRTCSocketClient::LibWebRTCSocketClient(WebCore::LibWebRTCSocketIdentifier identifier, NetworkRTCProvider& rtcProvider, std::unique_ptr<rtc::AsyncPacketSocket>&& socket, Type type)
     41LibWebRTCSocketClient::LibWebRTCSocketClient(WebCore::LibWebRTCSocketIdentifier identifier, NetworkRTCProvider& rtcProvider, std::unique_ptr<rtc::AsyncPacketSocket>&& socket, Type type, Ref<IPC::Connection>&& connection)
    4242    : m_identifier(identifier)
    4343    , m_type(type)
    4444    , m_rtcProvider(rtcProvider)
    4545    , m_socket(WTFMove(socket))
     46    , m_connection(WTFMove(connection))
    4647{
    4748    ASSERT(m_socket);
     
    9899{
    99100    ASSERT_UNUSED(socket, m_socket.get() == socket);
    100     auto buffer = WebCore::SharedBuffer::create(value, length);
    101     m_rtcProvider.sendFromMainThread([identifier = m_identifier, buffer = WTFMove(buffer), address = RTCNetwork::isolatedCopy(address), packetTime](IPC::Connection& connection) {
    102         IPC::DataReference data(reinterpret_cast<const uint8_t*>(buffer->data()), buffer->size());
    103         connection.send(Messages::LibWebRTCNetwork::SignalReadPacket(identifier, data, RTCNetwork::IPAddress(address.ipaddr()), address.port(), packetTime), 0);
    104     });
     101    IPC::DataReference data(reinterpret_cast<const uint8_t*>(value), length);
     102    m_connection->send(Messages::LibWebRTCNetwork::SignalReadPacket(m_identifier, data, RTCNetwork::IPAddress(address.ipaddr()), address.port(), packetTime), 0);
    105103}
    106104
     
    108106{
    109107    ASSERT_UNUSED(socket, m_socket.get() == socket);
    110     m_rtcProvider.sendFromMainThread([identifier = m_identifier, sentPacket](IPC::Connection& connection) {
    111         connection.send(Messages::LibWebRTCNetwork::SignalSentPacket(identifier, sentPacket.packet_id, sentPacket.send_time_ms), 0);
    112     });
     108    m_connection->send(Messages::LibWebRTCNetwork::SignalSentPacket(m_identifier, sentPacket.packet_id, sentPacket.send_time_ms), 0);
    113109}
    114110
     
    122118{
    123119    ASSERT_UNUSED(socket, m_socket.get() == socket);
    124     m_rtcProvider.sendFromMainThread([identifier = m_identifier, address = RTCNetwork::isolatedCopy(address)](IPC::Connection& connection) {
    125         connection.send(Messages::LibWebRTCNetwork::SignalAddressReady(identifier, RTCNetwork::SocketAddress(address)), 0);
    126     });
     120    m_connection->send(Messages::LibWebRTCNetwork::SignalAddressReady(m_identifier, RTCNetwork::SocketAddress(address)), 0);
    127121}
    128122
     
    135129{
    136130    ASSERT_UNUSED(socket, m_socket.get() == socket);
    137     m_rtcProvider.sendFromMainThread([identifier = m_identifier](IPC::Connection& connection) {
    138         connection.send(Messages::LibWebRTCNetwork::SignalConnect(identifier), 0);
    139     });
     131    m_connection->send(Messages::LibWebRTCNetwork::SignalConnect(m_identifier), 0);
    140132}
    141133
     
    143135{
    144136    ASSERT_UNUSED(socket, m_socket.get() == socket);
    145     m_rtcProvider.sendFromMainThread([identifier = m_identifier, error](IPC::Connection& connection) {
    146         connection.send(Messages::LibWebRTCNetwork::SignalClose(identifier, error), 0);
    147     });
     137    m_connection->send(Messages::LibWebRTCNetwork::SignalClose(m_identifier, error), 0);
     138
    148139    // We want to remove 'this' from the socket map now but we will destroy it asynchronously
    149140    // so that the socket parameter of signalClose remains alive as the caller of signalClose may actually being using it afterwards.
  • trunk/Source/WebKit/NetworkProcess/webrtc/LibWebRTCSocketClient.h

    r263272 r263670  
    4242    WTF_MAKE_FAST_ALLOCATED;
    4343public:
    44     LibWebRTCSocketClient(WebCore::LibWebRTCSocketIdentifier, NetworkRTCProvider&, std::unique_ptr<rtc::AsyncPacketSocket>&&, Type);
     44    LibWebRTCSocketClient(WebCore::LibWebRTCSocketIdentifier, NetworkRTCProvider&, std::unique_ptr<rtc::AsyncPacketSocket>&&, Type, Ref<IPC::Connection>&&);
    4545
    4646private:
     
    6565    NetworkRTCProvider& m_rtcProvider;
    6666    std::unique_ptr<rtc::AsyncPacketSocket> m_socket;
     67    Ref<IPC::Connection> m_connection;
    6768    int m_sendError { 0 };
    6869};
  • trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCProvider.cpp

    r261163 r263670  
    114114}
    115115
    116 void NetworkRTCProvider::createSocket(LibWebRTCSocketIdentifier identifier, std::unique_ptr<rtc::AsyncPacketSocket>&& socket, Socket::Type type)
     116void NetworkRTCProvider::createSocket(LibWebRTCSocketIdentifier identifier, std::unique_ptr<rtc::AsyncPacketSocket>&& socket, Socket::Type type, Ref<IPC::Connection>&& connection)
    117117{
    118118    if (!socket) {
    119         sendFromMainThread([this, identifier, size = m_sockets.size()](IPC::Connection& connection) {
    120             RELEASE_LOG_ERROR_IF_ALLOWED("createSocket with %u sockets is unable to create a new socket", size);
    121             connection.send(Messages::LibWebRTCNetwork::SignalClose(identifier, 1), 0);
    122         });
     119        RELEASE_LOG_ERROR_IF_ALLOWED("createSocket with %u sockets is unable to create a new socket", m_sockets.size());
     120        connection->send(Messages::LibWebRTCNetwork::SignalClose(identifier, 1), 0);
    123121        return;
    124122    }
    125     addSocket(identifier, makeUnique<LibWebRTCSocketClient>(identifier, *this, WTFMove(socket), type));
     123    addSocket(identifier, makeUnique<LibWebRTCSocketClient>(identifier, *this, WTFMove(socket), type, WTFMove(connection)));
    126124}
    127125
    128126void NetworkRTCProvider::createUDPSocket(LibWebRTCSocketIdentifier identifier, const RTCNetwork::SocketAddress& address, uint16_t minPort, uint16_t maxPort)
    129127{
    130     callOnRTCNetworkThread([this, identifier, address = RTCNetwork::isolatedCopy(address.value), minPort, maxPort]() {
     128    callOnRTCNetworkThread([this, identifier, address = RTCNetwork::isolatedCopy(address.value), minPort, maxPort, connection = makeRef(m_connection->connection())]() mutable {
    131129        std::unique_ptr<rtc::AsyncPacketSocket> socket(m_packetSocketFactory->CreateUdpSocket(address, minPort, maxPort));
    132         createSocket(identifier, WTFMove(socket), Socket::Type::UDP);
     130        createSocket(identifier, WTFMove(socket), Socket::Type::UDP, WTFMove(connection));
    133131    });
    134132}
     
    142140    }
    143141
    144     callOnRTCNetworkThread([this, identifier, address = RTCNetwork::isolatedCopy(address.value), minPort, maxPort, options]() {
     142    callOnRTCNetworkThread([this, identifier, address = RTCNetwork::isolatedCopy(address.value), minPort, maxPort, options, connection = makeRef(m_connection->connection())]() mutable {
    145143        std::unique_ptr<rtc::AsyncPacketSocket> socket(m_packetSocketFactory->CreateServerTcpSocket(address, minPort, maxPort, options));
    146         createSocket(identifier, WTFMove(socket), Socket::Type::ServerTCP);
     144        createSocket(identifier, WTFMove(socket), Socket::Type::ServerTCP, WTFMove(connection));
    147145    });
    148146}
     
    162160        return;
    163161    }
    164     callOnRTCNetworkThread([this, identifier, localAddress = RTCNetwork::isolatedCopy(localAddress.value), remoteAddress = RTCNetwork::isolatedCopy(remoteAddress.value), proxyInfo = proxyInfoFromSession(remoteAddress, *session), userAgent = WTFMove(userAgent).isolatedCopy(), options]() {
     162    callOnRTCNetworkThread([this, identifier, localAddress = RTCNetwork::isolatedCopy(localAddress.value), remoteAddress = RTCNetwork::isolatedCopy(remoteAddress.value), proxyInfo = proxyInfoFromSession(remoteAddress, *session), userAgent = WTFMove(userAgent).isolatedCopy(), options, connection = makeRef(m_connection->connection())]() mutable {
    165163        rtc::PacketSocketTcpOptions tcpOptions;
    166164        tcpOptions.opts = options;
    167165        std::unique_ptr<rtc::AsyncPacketSocket> socket(m_packetSocketFactory->CreateClientTcpSocket(localAddress, remoteAddress, proxyInfo, userAgent.utf8().data(), tcpOptions));
    168         createSocket(identifier, WTFMove(socket), Socket::Type::ClientTCP);
     166        createSocket(identifier, WTFMove(socket), Socket::Type::ClientTCP, WTFMove(connection));
    169167    });
    170168}
     
    172170void NetworkRTCProvider::wrapNewTCPConnection(LibWebRTCSocketIdentifier identifier, LibWebRTCSocketIdentifier newConnectionSocketIdentifier)
    173171{
    174     callOnRTCNetworkThread([this, identifier, newConnectionSocketIdentifier]() {
     172    callOnRTCNetworkThread([this, identifier, newConnectionSocketIdentifier, connection = makeRef(m_connection->connection())]() mutable {
    175173        auto socket = m_pendingIncomingSockets.take(newConnectionSocketIdentifier);
    176174        RELEASE_LOG_IF(!socket, WebRTC, "NetworkRTCProvider::wrapNewTCPConnection received an invalid socket identifier");
    177175        if (socket)
    178             addSocket(identifier, makeUnique<LibWebRTCSocketClient>(identifier, *this, WTFMove(socket), Socket::Type::ServerConnectionTCP));
     176            addSocket(identifier, makeUnique<LibWebRTCSocketClient>(identifier, *this, WTFMove(socket), Socket::Type::ServerConnectionTCP, WTFMove(connection)));
    179177    });
    180178}
  • trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCProvider.h

    r256185 r263670  
    111111    void addSocket(WebCore::LibWebRTCSocketIdentifier, std::unique_ptr<Socket>&&);
    112112
    113     void createSocket(WebCore::LibWebRTCSocketIdentifier, std::unique_ptr<rtc::AsyncPacketSocket>&&, Socket::Type);
     113    void createSocket(WebCore::LibWebRTCSocketIdentifier, std::unique_ptr<rtc::AsyncPacketSocket>&&, Socket::Type, Ref<IPC::Connection>&&);
    114114
    115115    void OnMessage(rtc::Message*);
Note: See TracChangeset for help on using the changeset viewer.