Serenity Operating System
at master 60 lines 1.5 kB view raw
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}