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
Notes: sideshowbarker 2024-07-19 11:00:23 +09:00

View file

@ -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<KBuffer> {
if (pending_packets == 0)
return {};
Optional<KBuffer> 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();