ladybird/Kernel/WorkQueue.cpp
Gunnar Beutner e9898a6031 Kernel: Use plain Function objects for the WorkQueue
The WorkQueue class previously had its own inline storage functionality
for function pointers. With the recent changes to the Function class
this is no longer necessary.
2021-05-19 21:36:57 +02:00

56 lines
1.2 KiB
C++

/*
* Copyright (c) 2021, the SerenityOS developers.
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <Kernel/Process.h>
#include <Kernel/SpinLock.h>
#include <Kernel/WaitQueue.h>
#include <Kernel/WorkQueue.h>
namespace Kernel {
WorkQueue* g_io_work;
void WorkQueue::initialize()
{
g_io_work = new WorkQueue("IO WorkQueue");
}
WorkQueue::WorkQueue(const char* name)
{
RefPtr<Thread> thread;
Process::create_kernel_process(thread, name, [this] {
for (;;) {
WorkItem* item;
bool have_more;
{
ScopedSpinLock lock(m_lock);
item = m_items.take_first();
have_more = !m_items.is_empty();
}
if (item) {
item->function();
delete item;
if (have_more)
continue;
}
[[maybe_unused]] auto result = m_wait_queue.wait_on({});
}
});
// If we can't create the thread we're in trouble...
m_thread = thread.release_nonnull();
}
void WorkQueue::do_queue(WorkItem* item)
{
{
ScopedSpinLock lock(m_lock);
m_items.append(*item);
}
m_wait_queue.wake_one();
}
}