From a18aa8fd5f65708d840c5ff8c13f673ae4c8b079 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sun, 1 Dec 2019 16:47:49 +0100 Subject: [PATCH] Kernel: Use a WaitQueue in NetworkTask --- Kernel/Net/NetworkTask.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/Kernel/Net/NetworkTask.cpp b/Kernel/Net/NetworkTask.cpp index c6ae7bfaf7..06881db392 100644 --- a/Kernel/Net/NetworkTask.cpp +++ b/Kernel/Net/NetworkTask.cpp @@ -30,9 +30,10 @@ static void handle_tcp(const IPv4Packet&); void NetworkTask_main() { + WaitQueue packet_wait_queue; u8 octet = 15; int pending_packets = 0; - NetworkAdapter::for_each([&octet, &pending_packets](auto& adapter) { + NetworkAdapter::for_each([&](auto& adapter) { if (String(adapter.class_name()) == "LoopbackAdapter") { adapter.set_ipv4_address({ 127, 0, 0, 1 }); adapter.set_ipv4_netmask({ 255, 0, 0, 0 }); @@ -50,12 +51,15 @@ void NetworkTask_main() adapter.ipv4_netmask().to_string().characters(), adapter.ipv4_gateway().to_string().characters()); - adapter.on_receive = [&pending_packets]() { + adapter.on_receive = [&]() { pending_packets++; + packet_wait_queue.wake_all(); }; }); auto dequeue_packet = [&pending_packets]() -> Optional { + if (pending_packets == 0) + return {}; Optional packet; NetworkAdapter::for_each([&packet, &pending_packets](auto& adapter) { if (packet.has_value() || !adapter.has_queued_packets()) @@ -73,9 +77,7 @@ void NetworkTask_main() for (;;) { auto packet_maybe_null = dequeue_packet(); if (!packet_maybe_null.has_value()) { - (void)current->block_until("Networking", [&pending_packets] { - return pending_packets > 0; - }); + current->wait_on(packet_wait_queue); continue; } auto& packet = packet_maybe_null.value();