FinalizerTask.cpp 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. /*
  2. * Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <Kernel/Sections.h>
  7. #include <Kernel/Tasks/FinalizerTask.h>
  8. #include <Kernel/Tasks/Process.h>
  9. #include <Kernel/Tasks/Scheduler.h>
  10. namespace Kernel {
  11. static constexpr StringView finalizer_task_name = "Finalizer Task"sv;
  12. static void finalizer_task(void*)
  13. {
  14. Thread::current()->set_priority(THREAD_PRIORITY_LOW);
  15. while (!Process::current().is_dying()) {
  16. // The order of this if-else is important: We want to continue trying to finalize the threads in case
  17. // Thread::finalize_dying_threads set g_finalizer_has_work back to true due to OOM conditions
  18. if (g_finalizer_has_work.exchange(false, AK::MemoryOrder::memory_order_acq_rel) == true)
  19. Thread::finalize_dying_threads();
  20. else
  21. g_finalizer_wait_queue->wait_forever(finalizer_task_name);
  22. }
  23. Process::current().sys$exit(0);
  24. VERIFY_NOT_REACHED();
  25. }
  26. UNMAP_AFTER_INIT void FinalizerTask::spawn()
  27. {
  28. auto [_, finalizer_thread] = MUST(Process::create_kernel_process(KString::must_create(finalizer_task_name), finalizer_task, nullptr));
  29. g_finalizer = move(finalizer_thread);
  30. }
  31. }