From 6a20733fcd2dabebc0e5954bb1971628a3c3ef6e Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sun, 15 Aug 2021 16:37:45 +0200 Subject: [PATCH] Kernel: Convert TCP retransmit queue from HashTable to IntrusiveList --- Kernel/Net/NetworkTask.cpp | 2 +- Kernel/Net/TCPSocket.cpp | 12 ++++++------ Kernel/Net/TCPSocket.h | 7 ++++++- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/Kernel/Net/NetworkTask.cpp b/Kernel/Net/NetworkTask.cpp index d1184e329b..0a8933a902 100644 --- a/Kernel/Net/NetworkTask.cpp +++ b/Kernel/Net/NetworkTask.cpp @@ -642,7 +642,7 @@ void retransmit_tcp_packets() // in case retransmit_packets() realizes that it wants to close the socket. NonnullRefPtrVector sockets; TCPSocket::sockets_for_retransmit().for_each_shared([&](const auto& socket) { - sockets.append(*socket); + sockets.append(socket); }); for (auto& socket : sockets) { diff --git a/Kernel/Net/TCPSocket.cpp b/Kernel/Net/TCPSocket.cpp index b55982b9a4..87ec059409 100644 --- a/Kernel/Net/TCPSocket.cpp +++ b/Kernel/Net/TCPSocket.cpp @@ -512,24 +512,24 @@ KResult TCPSocket::close() return result; } -static Singleton>> s_sockets_for_retransmit; +static Singleton> s_sockets_for_retransmit; -ProtectedValue>& TCPSocket::sockets_for_retransmit() +ProtectedValue& TCPSocket::sockets_for_retransmit() { return *s_sockets_for_retransmit; } void TCPSocket::enqueue_for_retransmit() { - sockets_for_retransmit().with_exclusive([&](auto& table) { - table.set(this); + sockets_for_retransmit().with_exclusive([&](auto& list) { + list.append(*this); }); } void TCPSocket::dequeue_for_retransmit() { - sockets_for_retransmit().with_exclusive([&](auto& table) { - table.remove(this); + sockets_for_retransmit().with_exclusive([&](auto& list) { + list.remove(*this); }); } diff --git a/Kernel/Net/TCPSocket.h b/Kernel/Net/TCPSocket.h index a85145db4b..9d491e4db9 100644 --- a/Kernel/Net/TCPSocket.h +++ b/Kernel/Net/TCPSocket.h @@ -153,7 +153,6 @@ public: void release_to_originator(); void release_for_accept(RefPtr); - static ProtectedValue>& sockets_for_retransmit(); void retransmit_packets(); virtual KResult close() override; @@ -222,6 +221,12 @@ private: // FIXME: Parse window size TCP option from the peer u32 m_send_window_size { 64 * KiB }; + + IntrusiveListNode m_retransmit_list_node; + +public: + using RetransmitList = IntrusiveList, &TCPSocket::m_retransmit_list_node>; + static ProtectedValue& sockets_for_retransmit(); }; }