Changeset 263670 in webkit
- Timestamp:
- Jun 29, 2020, 11:27:54 AM (4 years ago)
- Location:
- trunk/Source/WebKit
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit/ChangeLog
r263652 r263670 1 2020-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 1 28 2020-06-29 Elliot <CheeseEBoi@mailo.com> 2 29 -
trunk/Source/WebKit/NetworkProcess/webrtc/LibWebRTCSocketClient.cpp
r263272 r263670 39 39 namespace WebKit { 40 40 41 LibWebRTCSocketClient::LibWebRTCSocketClient(WebCore::LibWebRTCSocketIdentifier identifier, NetworkRTCProvider& rtcProvider, std::unique_ptr<rtc::AsyncPacketSocket>&& socket, Type type )41 LibWebRTCSocketClient::LibWebRTCSocketClient(WebCore::LibWebRTCSocketIdentifier identifier, NetworkRTCProvider& rtcProvider, std::unique_ptr<rtc::AsyncPacketSocket>&& socket, Type type, Ref<IPC::Connection>&& connection) 42 42 : m_identifier(identifier) 43 43 , m_type(type) 44 44 , m_rtcProvider(rtcProvider) 45 45 , m_socket(WTFMove(socket)) 46 , m_connection(WTFMove(connection)) 46 47 { 47 48 ASSERT(m_socket); … … 98 99 { 99 100 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); 105 103 } 106 104 … … 108 106 { 109 107 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); 113 109 } 114 110 … … 122 118 { 123 119 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); 127 121 } 128 122 … … 135 129 { 136 130 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); 140 132 } 141 133 … … 143 135 { 144 136 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 148 139 // We want to remove 'this' from the socket map now but we will destroy it asynchronously 149 140 // 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 42 42 WTF_MAKE_FAST_ALLOCATED; 43 43 public: 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>&&); 45 45 46 46 private: … … 65 65 NetworkRTCProvider& m_rtcProvider; 66 66 std::unique_ptr<rtc::AsyncPacketSocket> m_socket; 67 Ref<IPC::Connection> m_connection; 67 68 int m_sendError { 0 }; 68 69 }; -
trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCProvider.cpp
r261163 r263670 114 114 } 115 115 116 void NetworkRTCProvider::createSocket(LibWebRTCSocketIdentifier identifier, std::unique_ptr<rtc::AsyncPacketSocket>&& socket, Socket::Type type )116 void NetworkRTCProvider::createSocket(LibWebRTCSocketIdentifier identifier, std::unique_ptr<rtc::AsyncPacketSocket>&& socket, Socket::Type type, Ref<IPC::Connection>&& connection) 117 117 { 118 118 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); 123 121 return; 124 122 } 125 addSocket(identifier, makeUnique<LibWebRTCSocketClient>(identifier, *this, WTFMove(socket), type ));123 addSocket(identifier, makeUnique<LibWebRTCSocketClient>(identifier, *this, WTFMove(socket), type, WTFMove(connection))); 126 124 } 127 125 128 126 void NetworkRTCProvider::createUDPSocket(LibWebRTCSocketIdentifier identifier, const RTCNetwork::SocketAddress& address, uint16_t minPort, uint16_t maxPort) 129 127 { 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 { 131 129 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)); 133 131 }); 134 132 } … … 142 140 } 143 141 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 { 145 143 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)); 147 145 }); 148 146 } … … 162 160 return; 163 161 } 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 { 165 163 rtc::PacketSocketTcpOptions tcpOptions; 166 164 tcpOptions.opts = options; 167 165 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)); 169 167 }); 170 168 } … … 172 170 void NetworkRTCProvider::wrapNewTCPConnection(LibWebRTCSocketIdentifier identifier, LibWebRTCSocketIdentifier newConnectionSocketIdentifier) 173 171 { 174 callOnRTCNetworkThread([this, identifier, newConnectionSocketIdentifier ](){172 callOnRTCNetworkThread([this, identifier, newConnectionSocketIdentifier, connection = makeRef(m_connection->connection())]() mutable { 175 173 auto socket = m_pendingIncomingSockets.take(newConnectionSocketIdentifier); 176 174 RELEASE_LOG_IF(!socket, WebRTC, "NetworkRTCProvider::wrapNewTCPConnection received an invalid socket identifier"); 177 175 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))); 179 177 }); 180 178 } -
trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCProvider.h
r256185 r263670 111 111 void addSocket(WebCore::LibWebRTCSocketIdentifier, std::unique_ptr<Socket>&&); 112 112 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>&&); 114 114 115 115 void OnMessage(rtc::Message*);
Note:
See TracChangeset
for help on using the changeset viewer.