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:
parent
2ece61fa1f
commit
a18aa8fd5f
1 changed files with 7 additions and 5 deletions
|
@ -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();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue