Serenity Operating System
1/*
2 * Copyright (c) 2021, the SerenityOS developers.
3 * Copyright (c) 2021, Andreas Kling <kling@serenityos.org>
4 *
5 * SPDX-License-Identifier: BSD-2-Clause
6 */
7
8#include <Kernel/Process.h>
9#include <Kernel/Sections.h>
10#include <Kernel/WaitQueue.h>
11#include <Kernel/WorkQueue.h>
12
13namespace Kernel {
14
15WorkQueue* g_io_work;
16WorkQueue* g_ata_work;
17
18UNMAP_AFTER_INIT void WorkQueue::initialize()
19{
20 g_io_work = new WorkQueue("IO WorkQueue Task"sv);
21 g_ata_work = new WorkQueue("ATA WorkQueue Task"sv);
22}
23
24UNMAP_AFTER_INIT WorkQueue::WorkQueue(StringView name)
25{
26 LockRefPtr<Thread> thread;
27 auto name_kstring = KString::try_create(name);
28 if (name_kstring.is_error())
29 TODO();
30 (void)Process::create_kernel_process(thread, name_kstring.release_value(), [this] {
31 for (;;) {
32 WorkItem* item;
33 bool have_more;
34 m_items.with([&](auto& items) {
35 item = items.take_first();
36 have_more = !items.is_empty();
37 });
38 if (item) {
39 item->function();
40 delete item;
41
42 if (have_more)
43 continue;
44 }
45 [[maybe_unused]] auto result = m_wait_queue.wait_on({});
46 }
47 });
48 // If we can't create the thread we're in trouble...
49 m_thread = thread.release_nonnull();
50}
51
52void WorkQueue::do_queue(WorkItem& item)
53{
54 m_items.with([&](auto& items) {
55 items.append(item);
56 });
57 m_wait_queue.wake_one();
58}
59
60}