mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-04-22 12:35:14 +00:00
Kernel: Use a WaitQueue in NetworkTask
This commit is contained in:
parent
2ece61fa1f
commit
a18aa8fd5f
Notes:
sideshowbarker
2024-07-19 11:00:23 +09:00
Author: https://github.com/awesomekling Commit: https://github.com/SerenityOS/serenity/commit/a18aa8fd5f6
1 changed files with 7 additions and 5 deletions
|
@ -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();
|
||||
|
|
Loading…
Add table
Reference in a new issue