1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-08 19:47:34 +00:00

Kernel: Use a WaitQueue in NetworkTask

This commit is contained in:
Andreas Kling 2019-12-01 16:47:49 +01:00
parent 2ece61fa1f
commit a18aa8fd5f

View file

@ -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] { current->wait_on(packet_wait_queue);
return pending_packets > 0;
});
continue; continue;
} }
auto& packet = packet_maybe_null.value(); auto& packet = packet_maybe_null.value();