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 5b3a90131ae..d16fa977219 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 5b419b1efa2..72cda752ca9 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 a2634d3b156..b7a313c3c07 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 7ffb13dbff7..47844809ebc 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 cbf100c614f..86b72224415 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 a4a9975dd23..f3254fb4423 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 51adeacbd54..7e0ec2b93bd 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 77c34560d4b..c06ecb9691c 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 0121273958b..c803f82929a 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;