瀏覽代碼

Kernel: Convert IPv4 socket list from HashTable to IntrusiveList

There was no reason whatsoever to use a HashTable here. IntrusiveList
removes all the heap allocations and does everything more efficiently.
Andreas Kling 4 年之前
父節點
當前提交
7063303022
共有 3 個文件被更改,包括 17 次插入10 次删除
  1. 5 5
      Kernel/Net/IPv4Socket.cpp
  2. 7 2
      Kernel/Net/IPv4Socket.h
  3. 5 3
      Kernel/Net/NetworkTask.cpp

+ 5 - 5
Kernel/Net/IPv4Socket.cpp

@@ -26,13 +26,13 @@
 
 namespace Kernel {
 
-static Singleton<ProtectedValue<HashTable<IPv4Socket*>>> s_table;
+static Singleton<ProtectedValue<IPv4Socket::List>> s_all_sockets;
 
 using BlockFlags = Thread::FileDescriptionBlocker::BlockFlags;
 
-ProtectedValue<HashTable<IPv4Socket*>>& IPv4Socket::all_sockets()
+ProtectedValue<IPv4Socket::List>& IPv4Socket::all_sockets()
 {
-    return *s_table;
+    return *s_all_sockets;
 }
 
 OwnPtr<DoubleBuffer> IPv4Socket::create_receive_buffer()
@@ -79,14 +79,14 @@ IPv4Socket::IPv4Socket(int type, int protocol, NonnullOwnPtr<DoubleBuffer> recei
     }
 
     all_sockets().with_exclusive([&](auto& table) {
-        table.set(this);
+        table.append(*this);
     });
 }
 
 IPv4Socket::~IPv4Socket()
 {
     all_sockets().with_exclusive([&](auto& table) {
-        table.remove(this);
+        table.remove(*this);
     });
 }
 

+ 7 - 2
Kernel/Net/IPv4Socket.h

@@ -31,8 +31,6 @@ public:
     static KResultOr<NonnullRefPtr<Socket>> create(int type, int protocol);
     virtual ~IPv4Socket() override;
 
-    static ProtectedValue<HashTable<IPv4Socket*>>& all_sockets();
-
     virtual KResult close() override;
     virtual KResult bind(Userspace<const sockaddr*>, socklen_t) override;
     virtual KResult connect(FileDescription&, Userspace<const sockaddr*>, socklen_t, ShouldBlock = ShouldBlock::Yes) override;
@@ -131,6 +129,13 @@ private:
     BufferMode m_buffer_mode { BufferMode::Packets };
 
     OwnPtr<KBuffer> m_scratch_buffer;
+
+    IntrusiveListNode<IPv4Socket> m_list_node;
+
+public:
+    using List = IntrusiveList<IPv4Socket, RawPtr<IPv4Socket>, &IPv4Socket::m_list_node>;
+
+    static ProtectedValue<IPv4Socket::List>& all_sockets();
 };
 
 }

+ 5 - 3
Kernel/Net/NetworkTask.cpp

@@ -224,9 +224,11 @@ void handle_icmp(EthernetFrameHeader const& eth, IPv4Packet const& ipv4_packet,
 
     {
         NonnullRefPtrVector<IPv4Socket> icmp_sockets;
-        IPv4Socket::all_sockets().for_each_shared([&](const auto& socket) {
-            if (socket->protocol() == (unsigned)IPv4Protocol::ICMP)
-                icmp_sockets.append(*socket);
+        IPv4Socket::all_sockets().with_exclusive([&](auto& sockets) {
+            for (auto& socket : sockets) {
+                if (socket.protocol() == (unsigned)IPv4Protocol::ICMP)
+                    icmp_sockets.append(socket);
+            }
         });
         for (auto& socket : icmp_sockets)
             socket.did_receive(ipv4_packet.source(), 0, { &ipv4_packet, sizeof(IPv4Packet) + ipv4_packet.payload_size() }, packet_timestamp);