mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-08-28 13:18:19 +00:00
RequestServer: Add an IPC method to reconnect N request clients
Similar to the same IPC on ImageDecoder, this just avoids IPC churn.
This commit is contained in:
parent
78a08bac82
commit
58f5fe7d79
Notes:
github-actions[bot]
2025-08-10 09:04:30 +00:00
Author: https://github.com/trflynn89
Commit: 58f5fe7d79
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/5796
3 changed files with 40 additions and 10 deletions
|
@ -365,25 +365,50 @@ Messages::RequestServer::InitTransportResponse ConnectionFromClient::init_transp
|
||||||
}
|
}
|
||||||
|
|
||||||
Messages::RequestServer::ConnectNewClientResponse ConnectionFromClient::connect_new_client()
|
Messages::RequestServer::ConnectNewClientResponse ConnectionFromClient::connect_new_client()
|
||||||
|
{
|
||||||
|
auto client_socket = create_client_socket();
|
||||||
|
if (client_socket.is_error()) {
|
||||||
|
dbgln("Failed to create client socket: {}", client_socket.error());
|
||||||
|
return IPC::File {};
|
||||||
|
}
|
||||||
|
|
||||||
|
return client_socket.release_value();
|
||||||
|
}
|
||||||
|
|
||||||
|
Messages::RequestServer::ConnectNewClientsResponse ConnectionFromClient::connect_new_clients(size_t count)
|
||||||
|
{
|
||||||
|
Vector<IPC::File> files;
|
||||||
|
files.ensure_capacity(count);
|
||||||
|
|
||||||
|
for (size_t i = 0; i < count; ++i) {
|
||||||
|
auto client_socket = create_client_socket();
|
||||||
|
if (client_socket.is_error()) {
|
||||||
|
dbgln("Failed to create client socket: {}", client_socket.error());
|
||||||
|
return Vector<IPC::File> {};
|
||||||
|
}
|
||||||
|
|
||||||
|
files.unchecked_append(client_socket.release_value());
|
||||||
|
}
|
||||||
|
|
||||||
|
return files;
|
||||||
|
}
|
||||||
|
|
||||||
|
ErrorOr<IPC::File> ConnectionFromClient::create_client_socket()
|
||||||
{
|
{
|
||||||
// TODO: Mach IPC
|
// TODO: Mach IPC
|
||||||
|
|
||||||
int socket_fds[2] {};
|
int socket_fds[2] {};
|
||||||
if (auto err = Core::System::socketpair(AF_LOCAL, SOCK_STREAM, 0, socket_fds); err.is_error()) {
|
TRY(Core::System::socketpair(AF_LOCAL, SOCK_STREAM, 0, socket_fds));
|
||||||
dbgln("Failed to create client socketpair: {}", err.error());
|
|
||||||
return IPC::File {};
|
|
||||||
}
|
|
||||||
|
|
||||||
auto client_socket_or_error = Core::LocalSocket::adopt_fd(socket_fds[0]);
|
auto client_socket = Core::LocalSocket::adopt_fd(socket_fds[0]);
|
||||||
if (client_socket_or_error.is_error()) {
|
if (client_socket.is_error()) {
|
||||||
close(socket_fds[0]);
|
close(socket_fds[0]);
|
||||||
close(socket_fds[1]);
|
close(socket_fds[1]);
|
||||||
dbgln("Failed to adopt client socket: {}", client_socket_or_error.error());
|
return client_socket.release_error();
|
||||||
return IPC::File {};
|
|
||||||
}
|
}
|
||||||
auto client_socket = client_socket_or_error.release_value();
|
|
||||||
// Note: A ref is stored in the static s_connections map
|
// Note: A ref is stored in the static s_connections map
|
||||||
auto client = adopt_ref(*new ConnectionFromClient(make<IPC::Transport>(move(client_socket))));
|
auto client = adopt_ref(*new ConnectionFromClient(make<IPC::Transport>(client_socket.release_value())));
|
||||||
|
|
||||||
return IPC::File::adopt_fd(socket_fds[1]);
|
return IPC::File::adopt_fd(socket_fds[1]);
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,6 +39,8 @@ private:
|
||||||
|
|
||||||
virtual Messages::RequestServer::InitTransportResponse init_transport(int peer_pid) override;
|
virtual Messages::RequestServer::InitTransportResponse init_transport(int peer_pid) override;
|
||||||
virtual Messages::RequestServer::ConnectNewClientResponse connect_new_client() override;
|
virtual Messages::RequestServer::ConnectNewClientResponse connect_new_client() override;
|
||||||
|
virtual Messages::RequestServer::ConnectNewClientsResponse connect_new_clients(size_t count) override;
|
||||||
|
|
||||||
virtual Messages::RequestServer::IsSupportedProtocolResponse is_supported_protocol(ByteString) override;
|
virtual Messages::RequestServer::IsSupportedProtocolResponse is_supported_protocol(ByteString) override;
|
||||||
virtual void set_dns_server(ByteString host_or_address, u16 port, bool use_tls, bool validate_dnssec_locally) override;
|
virtual void set_dns_server(ByteString host_or_address, u16 port, bool use_tls, bool validate_dnssec_locally) override;
|
||||||
virtual void set_use_system_dns() override;
|
virtual void set_use_system_dns() override;
|
||||||
|
@ -57,6 +59,8 @@ private:
|
||||||
struct ActiveRequest;
|
struct ActiveRequest;
|
||||||
friend struct ActiveRequest;
|
friend struct ActiveRequest;
|
||||||
|
|
||||||
|
static ErrorOr<IPC::File> create_client_socket();
|
||||||
|
|
||||||
static int on_socket_callback(void*, int sockfd, int what, void* user_data, void*);
|
static int on_socket_callback(void*, int sockfd, int what, void* user_data, void*);
|
||||||
static int on_timeout_callback(void*, long timeout_ms, void* user_data);
|
static int on_timeout_callback(void*, long timeout_ms, void* user_data);
|
||||||
static size_t on_header_received(void* buffer, size_t size, size_t nmemb, void* user_data);
|
static size_t on_header_received(void* buffer, size_t size, size_t nmemb, void* user_data);
|
||||||
|
|
|
@ -7,6 +7,7 @@ endpoint RequestServer
|
||||||
{
|
{
|
||||||
init_transport(int peer_pid) => (int peer_pid)
|
init_transport(int peer_pid) => (int peer_pid)
|
||||||
connect_new_client() => (IPC::File client_socket)
|
connect_new_client() => (IPC::File client_socket)
|
||||||
|
connect_new_clients(size_t count) => (Vector<IPC::File> sockets)
|
||||||
|
|
||||||
// use_tls: enable DNS over TLS
|
// use_tls: enable DNS over TLS
|
||||||
set_dns_server(ByteString host_or_address, u16 port, bool use_tls, bool validate_dnssec_locally) =|
|
set_dns_server(ByteString host_or_address, u16 port, bool use_tls, bool validate_dnssec_locally) =|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue