#pragma once #include "fs/VFS.h" #include "thread/Thread.h" namespace Scheduler { void init(); Thread* current(); Thread* idle(); Thread* init_thread(); void set_reap_thread(Thread*); void signal_reap_thread(); Result new_kernel_thread(u64 address, const char* name); Result new_kernel_thread(void (*func)(void), const char* name); Result new_kernel_thread(void (*func)(void*), void* arg, const char* name); Result new_userspace_thread(SharedPtr inode, const char* name); void add_thread(Thread* thread); Thread* pick_task(); void reap_thread(Thread* thread); void switch_task(Registers* regs); void invoke(Registers* regs); LinkedList check_for_dying_threads(); Option find_by_pid(pid_t pid); template void for_each_child(Thread* thread, Callback callback) { for (Thread* current = thread; current; current = g_threads.next(current).value_or(nullptr)) { if (current->parent == thread) { bool should_continue = callback(current); if (!should_continue) return; } } } void dump_state(); bool has_children(Thread* thread); Option find_exited_child(Thread* thread); } extern "C" void kernel_yield(); void kernel_wait(pid_t pid); void kernel_sleep(u64 ms); [[noreturn]] void kernel_exit(); // Freezes the current thread until someone else calls wake_up() on this thread. void kernel_wait_for_event();