Serenity Operating System
at master 37 lines 1.2 kB view raw
1/* 2 * Copyright (c) 2020, Andreas Kling <kling@serenityos.org> 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 */ 6 7#include <Kernel/Process.h> 8#include <Kernel/Scheduler.h> 9#include <Kernel/Sections.h> 10#include <Kernel/Tasks/FinalizerTask.h> 11 12namespace Kernel { 13 14static constexpr StringView finalizer_task_name = "Finalizer Task"sv; 15 16static void finalizer_task(void*) 17{ 18 Thread::current()->set_priority(THREAD_PRIORITY_LOW); 19 for (;;) { 20 // The order of this if-else is important: We want to continue trying to finalize the threads in case 21 // Thread::finalize_dying_threads set g_finalizer_has_work back to true due to OOM conditions 22 if (g_finalizer_has_work.exchange(false, AK::MemoryOrder::memory_order_acq_rel) == true) 23 Thread::finalize_dying_threads(); 24 else 25 g_finalizer_wait_queue->wait_forever(finalizer_task_name); 26 } 27}; 28 29UNMAP_AFTER_INIT void FinalizerTask::spawn() 30{ 31 LockRefPtr<Thread> finalizer_thread; 32 auto finalizer_process = Process::create_kernel_process(finalizer_thread, KString::must_create(finalizer_task_name), finalizer_task, nullptr); 33 VERIFY(finalizer_process); 34 g_finalizer = finalizer_thread; 35} 36 37}