diff options
Diffstat (limited to 'Userland')
-rw-r--r-- | Userland/Services/RequestServer/ConnectionCache.cpp | 27 | ||||
-rw-r--r-- | Userland/Services/RequestServer/ConnectionCache.h | 13 |
2 files changed, 21 insertions, 19 deletions
diff --git a/Userland/Services/RequestServer/ConnectionCache.cpp b/Userland/Services/RequestServer/ConnectionCache.cpp index 6571715f52..f729eb03d5 100644 --- a/Userland/Services/RequestServer/ConnectionCache.cpp +++ b/Userland/Services/RequestServer/ConnectionCache.cpp @@ -9,8 +9,8 @@ namespace RequestServer::ConnectionCache { -HashMap<ConnectionKey, NonnullOwnPtrVector<Connection<Core::TCPSocket>>> g_tcp_connection_cache {}; -HashMap<ConnectionKey, NonnullOwnPtrVector<Connection<TLS::TLSv12>>> g_tls_connection_cache {}; +HashMap<ConnectionKey, NonnullOwnPtr<NonnullOwnPtrVector<Connection<Core::TCPSocket>>>> g_tcp_connection_cache {}; +HashMap<ConnectionKey, NonnullOwnPtr<NonnullOwnPtrVector<Connection<TLS::TLSv12>>>> g_tls_connection_cache {}; void request_did_finish(URL const& url, Core::Socket const* socket) { @@ -28,7 +28,7 @@ void request_did_finish(URL const& url, Core::Socket const* socket) dbgln("Request for URL {} finished, but we don't own that!", url); return; } - auto connection_it = it->value.find_if([&](auto& connection) { return connection->socket == socket; }); + auto connection_it = it->value->find_if([&](auto& connection) { return connection->socket == socket; }); if (connection_it.is_end()) { dbgln("Request for URL {} finished, but we don't have a socket for that!", url); return; @@ -39,10 +39,11 @@ void request_did_finish(URL const& url, Core::Socket const* socket) connection->has_started = false; if constexpr (REQUEST_SERVER_DEBUG) connection->current_url = {}; - connection->removal_timer->on_timeout = [ptr = connection.ptr(), &cache_entry = it->value, &key = it->key, &cache] { - Core::deferred_invoke([&] { - dbgln("Removing no-longer-used connection {}", ptr); - cache_entry.remove_first_matching([&](auto& entry) { return entry.ptr() == ptr; }); + connection->removal_timer->on_timeout = [ptr = connection.ptr(), &cache_entry = *it->value, key = it->key, &cache]() mutable { + Core::deferred_invoke([&, key = move(key), ptr] { + dbgln("Removing no-longer-used connection {} (socket {})", ptr, ptr->socket); + auto did_remove = cache_entry.remove_first_matching([&](auto& entry) { return entry == ptr; }); + VERIFY(did_remove); if (cache_entry.is_empty()) cache.remove(key); }); @@ -57,10 +58,10 @@ void request_did_finish(URL const& url, Core::Socket const* socket) is_connected = connection->socket->is_connected(); if (!is_connected) { // Create another socket for the connection. - dbgln("Creating a new socket for {}", url); connection->socket = SocketType::construct(nullptr); + dbgln("Creating a new socket for {} -> {}", url, connection->socket); } - dbgln("Running next job in queue for connection {}", &connection); + dbgln("Running next job in queue for connection {} @{}", &connection, connection->socket); auto request = connection->request_queue.take_first(); if constexpr (REQUEST_SERVER_DEBUG) { connection->timer.start(); @@ -84,8 +85,8 @@ void dump_jobs() dbgln("=========== TLS Connection Cache =========="); for (auto& connection : g_tls_connection_cache) { dbgln(" - {}:{}", connection.key.hostname, connection.key.port); - for (auto& entry : connection.value) { - dbgln(" - Connection {} (started={})", &entry, entry.has_started); + for (auto& entry : *connection.value) { + dbgln(" - Connection {} (started={}) (socket={})", &entry, entry.has_started, entry.socket); dbgln(" Currently loading {} ({} elapsed)", entry.current_url, entry.timer.elapsed()); dbgln(" Request Queue:"); for (auto& job : entry.request_queue) @@ -95,8 +96,8 @@ void dump_jobs() dbgln("=========== TCP Connection Cache =========="); for (auto& connection : g_tcp_connection_cache) { dbgln(" - {}:{}", connection.key.hostname, connection.key.port); - for (auto& entry : connection.value) { - dbgln(" - Connection {} (started={})", &entry, entry.has_started); + for (auto& entry : *connection.value) { + dbgln(" - Connection {} (started={}) (socket={})", &entry, entry.has_started, entry.socket); dbgln(" Currently loading {} ({} elapsed)", entry.current_url, entry.timer.elapsed()); dbgln(" Request Queue:"); for (auto& job : entry.request_queue) diff --git a/Userland/Services/RequestServer/ConnectionCache.h b/Userland/Services/RequestServer/ConnectionCache.h index 4221244330..eba52f2b12 100644 --- a/Userland/Services/RequestServer/ConnectionCache.h +++ b/Userland/Services/RequestServer/ConnectionCache.h @@ -61,8 +61,8 @@ struct AK::Traits<RequestServer::ConnectionCache::ConnectionKey> : public AK::Ge namespace RequestServer::ConnectionCache { -extern HashMap<ConnectionKey, NonnullOwnPtrVector<Connection<Core::TCPSocket>>> g_tcp_connection_cache; -extern HashMap<ConnectionKey, NonnullOwnPtrVector<Connection<TLS::TLSv12>>> g_tls_connection_cache; +extern HashMap<ConnectionKey, NonnullOwnPtr<NonnullOwnPtrVector<Connection<Core::TCPSocket>>>> g_tcp_connection_cache; +extern HashMap<ConnectionKey, NonnullOwnPtr<NonnullOwnPtrVector<Connection<TLS::TLSv12>>>> g_tls_connection_cache; void request_did_finish(URL const&, Core::Socket const*); void dump_jobs(); @@ -72,14 +72,15 @@ constexpr static inline size_t ConnectionKeepAliveTimeMilliseconds = 10'000; decltype(auto) get_or_create_connection(auto& cache, URL const& url, auto& job) { + using CacheEntryType = RemoveCVReference<decltype(*cache.begin()->value)>; auto start_job = [&job](auto& socket) { job.start(socket); }; - auto& sockets_for_url = cache.ensure({ url.host(), url.port_or_default() }); + auto& sockets_for_url = *cache.ensure({ url.host(), url.port_or_default() }, [] { return make<CacheEntryType>(); }); auto it = sockets_for_url.find_if([](auto& connection) { return connection->request_queue.is_empty(); }); auto did_add_new_connection = false; if (it.is_end() && sockets_for_url.size() < ConnectionCache::MaxConcurrentConnectionsPerURL) { - using ConnectionType = RemoveCVReference<decltype(cache.begin()->value.at(0))>; + using ConnectionType = RemoveCVReference<decltype(cache.begin()->value->at(0))>; sockets_for_url.append(make<ConnectionType>( ConnectionType::SocketType::construct(nullptr), typename ConnectionType::QueueType {}, @@ -106,7 +107,7 @@ decltype(auto) get_or_create_connection(auto& cache, URL const& url, auto& job) } auto& connection = sockets_for_url[index]; if (!connection.has_started) { - dbgln("Immediately start request for url {} in {}", url, &connection); + dbgln("Immediately start request for url {} in {} - {}", url, &connection, connection.socket); connection.has_started = true; connection.removal_timer->stop(); if constexpr (REQUEST_SERVER_DEBUG) { @@ -115,7 +116,7 @@ decltype(auto) get_or_create_connection(auto& cache, URL const& url, auto& job) } start_job(*connection.socket); } else { - dbgln("Enqueue request for URL {} in {}", url, &connection); + dbgln("Enqueue request for URL {} in {} - {}", url, &connection, connection.socket); connection.request_queue.append(move(start_job)); } return connection; |