Browse Source

Kernel: Use a WaitQueue in NetworkTask

Andreas Kling 5 years ago
parent
commit
a18aa8fd5f
1 changed files with 7 additions and 5 deletions
  1. 7 5
      Kernel/Net/NetworkTask.cpp

+ 7 - 5
Kernel/Net/NetworkTask.cpp

@@ -30,9 +30,10 @@ static void handle_tcp(const IPv4Packet&);
 
 
 void NetworkTask_main()
 void NetworkTask_main()
 {
 {
+    WaitQueue packet_wait_queue;
     u8 octet = 15;
     u8 octet = 15;
     int pending_packets = 0;
     int pending_packets = 0;
-    NetworkAdapter::for_each([&octet, &pending_packets](auto& adapter) {
+    NetworkAdapter::for_each([&](auto& adapter) {
         if (String(adapter.class_name()) == "LoopbackAdapter") {
         if (String(adapter.class_name()) == "LoopbackAdapter") {
             adapter.set_ipv4_address({ 127, 0, 0, 1 });
             adapter.set_ipv4_address({ 127, 0, 0, 1 });
             adapter.set_ipv4_netmask({ 255, 0, 0, 0 });
             adapter.set_ipv4_netmask({ 255, 0, 0, 0 });
@@ -50,12 +51,15 @@ void NetworkTask_main()
             adapter.ipv4_netmask().to_string().characters(),
             adapter.ipv4_netmask().to_string().characters(),
             adapter.ipv4_gateway().to_string().characters());
             adapter.ipv4_gateway().to_string().characters());
 
 
-        adapter.on_receive = [&pending_packets]() {
+        adapter.on_receive = [&]() {
             pending_packets++;
             pending_packets++;
+            packet_wait_queue.wake_all();
         };
         };
     });
     });
 
 
     auto dequeue_packet = [&pending_packets]() -> Optional<KBuffer> {
     auto dequeue_packet = [&pending_packets]() -> Optional<KBuffer> {
+        if (pending_packets == 0)
+            return {};
         Optional<KBuffer> packet;
         Optional<KBuffer> packet;
         NetworkAdapter::for_each([&packet, &pending_packets](auto& adapter) {
         NetworkAdapter::for_each([&packet, &pending_packets](auto& adapter) {
             if (packet.has_value() || !adapter.has_queued_packets())
             if (packet.has_value() || !adapter.has_queued_packets())
@@ -73,9 +77,7 @@ void NetworkTask_main()
     for (;;) {
     for (;;) {
         auto packet_maybe_null = dequeue_packet();
         auto packet_maybe_null = dequeue_packet();
         if (!packet_maybe_null.has_value()) {
         if (!packet_maybe_null.has_value()) {
-            (void)current->block_until("Networking", [&pending_packets] {
-                return pending_packets > 0;
-            });
+            current->wait_on(packet_wait_queue);
             continue;
             continue;
         }
         }
         auto& packet = packet_maybe_null.value();
         auto& packet = packet_maybe_null.value();