From ddd79fe2cfa4759ed0fabbb875403248a918fa00 Mon Sep 17 00:00:00 2001 From: Brian Gianforcaro Date: Sun, 14 Feb 2021 15:02:14 -0800 Subject: [PATCH] Kernel: Add WaitQueue::wait_forever and it use it for all infinite waits. In preparation for marking BlockingResult [[nodiscard]], there are a few places that perform infinite waits, which we never observe the result of the wait. Instead of suppressing them, add an alternate function which returns void when performing and infinite wait. --- Kernel/Devices/SB16.cpp | 2 +- Kernel/FileSystem/FIFO.cpp | 4 ++-- Kernel/Lock.cpp | 2 +- Kernel/Net/E1000NetworkAdapter.cpp | 2 +- Kernel/Net/NE2000NetworkAdapter.cpp | 2 +- Kernel/Net/NetworkTask.cpp | 2 +- Kernel/Random.cpp | 2 +- Kernel/Tasks/FinalizerTask.cpp | 2 +- Kernel/WaitQueue.h | 6 ++++++ 9 files changed, 15 insertions(+), 9 deletions(-) diff --git a/Kernel/Devices/SB16.cpp b/Kernel/Devices/SB16.cpp index 5b3a90131a..d16fa97721 100644 --- a/Kernel/Devices/SB16.cpp +++ b/Kernel/Devices/SB16.cpp @@ -239,7 +239,7 @@ void SB16::handle_irq(const RegisterState&) void SB16::wait_for_irq() { - m_irq_queue.wait_on({}, "SB16"); + m_irq_queue.wait_forever("SB16"); disable_irq(); } diff --git a/Kernel/FileSystem/FIFO.cpp b/Kernel/FileSystem/FIFO.cpp index 5b419b1efa..72cda752ca 100644 --- a/Kernel/FileSystem/FIFO.cpp +++ b/Kernel/FileSystem/FIFO.cpp @@ -74,7 +74,7 @@ KResultOr> FIFO::open_direction_blocking(FIFO::Di if (m_writers == 0) { locker.unlock(); - m_write_open_queue.wait_on({}, "FIFO"); + m_write_open_queue.wait_forever("FIFO"); locker.lock(); } } @@ -84,7 +84,7 @@ KResultOr> FIFO::open_direction_blocking(FIFO::Di if (m_readers == 0) { locker.unlock(); - m_read_open_queue.wait_on({}, "FIFO"); + m_read_open_queue.wait_forever("FIFO"); locker.lock(); } } diff --git a/Kernel/Lock.cpp b/Kernel/Lock.cpp index a2634d3b15..b7a313c3c0 100644 --- a/Kernel/Lock.cpp +++ b/Kernel/Lock.cpp @@ -127,7 +127,7 @@ void Lock::lock(Mode mode) } m_lock.store(false, AK::memory_order_release); dbgln_if(LOCK_TRACE_DEBUG, "Lock::lock @ {} ({}) waiting...", this, m_name); - m_queue.wait_on({}, m_name); + m_queue.wait_forever(m_name); dbgln_if(LOCK_TRACE_DEBUG, "Lock::lock @ {} ({}) waited", this, m_name); } } diff --git a/Kernel/Net/E1000NetworkAdapter.cpp b/Kernel/Net/E1000NetworkAdapter.cpp index 7ffb13dbff..47844809eb 100644 --- a/Kernel/Net/E1000NetworkAdapter.cpp +++ b/Kernel/Net/E1000NetworkAdapter.cpp @@ -444,7 +444,7 @@ void E1000NetworkAdapter::send_raw(ReadonlyBytes payload) sti(); break; } - m_wait_queue.wait_on({}, "E1000NetworkAdapter"); + m_wait_queue.wait_forever("E1000NetworkAdapter"); } #if E1000_DEBUG dbgln("E1000: Sent packet, status is now {:#02x}!", (u8)descriptor.status); diff --git a/Kernel/Net/NE2000NetworkAdapter.cpp b/Kernel/Net/NE2000NetworkAdapter.cpp index cbf100c614..86b7222441 100644 --- a/Kernel/Net/NE2000NetworkAdapter.cpp +++ b/Kernel/Net/NE2000NetworkAdapter.cpp @@ -392,7 +392,7 @@ void NE2000NetworkAdapter::send_raw(ReadonlyBytes payload) } while (in8(REG_RW_COMMAND) & BIT_COMMAND_TXP) - m_wait_queue.wait_on({}, "NE2000NetworkAdapter"); + m_wait_queue.wait_forever("NE2000NetworkAdapter"); disable_irq(); size_t packet_size = payload.size(); diff --git a/Kernel/Net/NetworkTask.cpp b/Kernel/Net/NetworkTask.cpp index a4a9975dd2..f3254fb442 100644 --- a/Kernel/Net/NetworkTask.cpp +++ b/Kernel/Net/NetworkTask.cpp @@ -106,7 +106,7 @@ void NetworkTask_main(void*) for (;;) { size_t packet_size = dequeue_packet(buffer, buffer_size, packet_timestamp); if (!packet_size) { - packet_wait_queue.wait_on({}, "NetworkTask"); + packet_wait_queue.wait_forever("NetworkTask"); continue; } if (packet_size < sizeof(EthernetFrameHeader)) { diff --git a/Kernel/Random.cpp b/Kernel/Random.cpp index 51adeacbd5..7e0ec2b93b 100644 --- a/Kernel/Random.cpp +++ b/Kernel/Random.cpp @@ -91,7 +91,7 @@ void KernelRng::wait_for_entropy() ScopedSpinLock lock(get_lock()); if (!resource().is_ready()) { dbgln("Entropy starvation..."); - m_seed_queue.wait_on({}, "KernelRng"); + m_seed_queue.wait_forever("KernelRng"); } } diff --git a/Kernel/Tasks/FinalizerTask.cpp b/Kernel/Tasks/FinalizerTask.cpp index 77c34560d4..c06ecb9691 100644 --- a/Kernel/Tasks/FinalizerTask.cpp +++ b/Kernel/Tasks/FinalizerTask.cpp @@ -36,7 +36,7 @@ void FinalizerTask::spawn() finalizer_thread, "FinalizerTask", [](void*) { Thread::current()->set_priority(THREAD_PRIORITY_LOW); for (;;) { - g_finalizer_wait_queue->wait_on({}, "FinalizerTask"); + g_finalizer_wait_queue->wait_forever("FinalizerTask"); if (g_finalizer_has_work.exchange(false, AK::MemoryOrder::memory_order_acq_rel) == true) Thread::finalize_dying_threads(); diff --git a/Kernel/WaitQueue.h b/Kernel/WaitQueue.h index 0121273958..c803f82929 100644 --- a/Kernel/WaitQueue.h +++ b/Kernel/WaitQueue.h @@ -50,6 +50,12 @@ public: return Thread::current()->block(timeout, *this, forward(args)...); } + template + void wait_forever(Args&&... args) + { + (void)Thread::current()->block({}, *this, forward(args)...); + } + protected: virtual bool should_add_blocker(Thread::Blocker& b, void* data) override;