2022-12-07 15:03:34 +01:00
|
|
|
#pragma once
|
2023-03-11 10:34:08 +01:00
|
|
|
#include "fs/VFS.h"
|
2022-12-07 15:03:34 +01:00
|
|
|
#include "thread/Thread.h"
|
|
|
|
|
|
|
|
namespace Scheduler
|
|
|
|
{
|
|
|
|
void init();
|
|
|
|
|
|
|
|
Thread* current();
|
2022-12-07 15:55:58 +01:00
|
|
|
Thread* idle();
|
2023-05-04 22:58:04 +02:00
|
|
|
Thread* init_thread();
|
2022-12-07 15:03:34 +01:00
|
|
|
|
2023-05-04 23:06:00 +02:00
|
|
|
void set_reap_thread(Thread*);
|
|
|
|
void signal_reap_thread();
|
|
|
|
|
2023-08-17 20:14:33 +02:00
|
|
|
void set_oom_thread(Thread*);
|
|
|
|
void signal_oom_thread();
|
|
|
|
|
2023-05-04 23:06:00 +02:00
|
|
|
Result<Thread*> new_kernel_thread(u64 address, const char* name);
|
|
|
|
Result<Thread*> new_kernel_thread(void (*func)(void), const char* name);
|
|
|
|
Result<Thread*> new_kernel_thread(void (*func)(void*), void* arg, const char* name);
|
2022-12-07 15:03:34 +01:00
|
|
|
|
2023-04-28 13:23:07 +02:00
|
|
|
Result<Thread*> new_userspace_thread(SharedPtr<VFS::Inode> inode, const char* name);
|
2023-01-05 21:52:26 +01:00
|
|
|
|
2023-03-18 23:45:48 +01:00
|
|
|
void add_thread(Thread* thread);
|
|
|
|
|
2022-12-07 15:03:34 +01:00
|
|
|
Thread* pick_task();
|
|
|
|
|
2022-12-19 12:24:15 +01:00
|
|
|
void reap_thread(Thread* thread);
|
|
|
|
|
2022-12-07 15:03:34 +01:00
|
|
|
void switch_task(Registers* regs);
|
|
|
|
|
|
|
|
void invoke(Registers* regs);
|
2022-12-18 18:43:34 +01:00
|
|
|
|
2022-12-19 12:43:23 +01:00
|
|
|
LinkedList<Thread> check_for_dying_threads();
|
2023-03-23 22:42:24 +01:00
|
|
|
|
|
|
|
Option<Thread*> find_by_pid(pid_t pid);
|
2023-03-24 17:37:04 +01:00
|
|
|
|
2023-04-28 15:19:01 +02:00
|
|
|
template <typename Callback> void for_each_child(Thread* thread, Callback callback)
|
2023-03-24 17:37:04 +01:00
|
|
|
{
|
2023-04-28 15:19:01 +02:00
|
|
|
for (Thread* current = thread; current; current = g_threads.next(current).value_or(nullptr))
|
2023-04-28 15:13:53 +02:00
|
|
|
{
|
2023-05-04 22:58:04 +02:00
|
|
|
if (current->parent == thread)
|
2023-04-28 15:13:53 +02:00
|
|
|
{
|
2023-04-28 15:19:01 +02:00
|
|
|
bool should_continue = callback(current);
|
2023-04-28 15:13:53 +02:00
|
|
|
if (!should_continue) return;
|
|
|
|
}
|
|
|
|
}
|
2023-03-24 17:37:04 +01:00
|
|
|
}
|
|
|
|
|
2023-07-11 11:51:07 +02:00
|
|
|
template <typename Callback> void for_each_in_process_group(pid_t group, Callback callback)
|
|
|
|
{
|
|
|
|
for (Thread* current = g_threads.first().value_or(nullptr); current;
|
|
|
|
current = g_threads.next(current).value_or(nullptr))
|
|
|
|
{
|
2023-07-26 21:32:00 +02:00
|
|
|
if (current->pgid == group)
|
2023-07-11 11:51:07 +02:00
|
|
|
{
|
|
|
|
bool should_continue = callback(current);
|
|
|
|
if (!should_continue) return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-05-04 23:32:48 +02:00
|
|
|
void dump_state();
|
|
|
|
|
2023-04-28 15:19:01 +02:00
|
|
|
bool has_children(Thread* thread);
|
2023-03-24 17:37:04 +01:00
|
|
|
|
2023-04-28 15:19:01 +02:00
|
|
|
Option<Thread*> find_exited_child(Thread* thread);
|
2022-12-07 15:55:58 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
extern "C" void kernel_yield();
|
2023-05-04 23:03:31 +02:00
|
|
|
void kernel_wait(pid_t pid);
|
2022-12-18 18:43:34 +01:00
|
|
|
void kernel_sleep(u64 ms);
|
2023-01-02 13:07:29 +01:00
|
|
|
[[noreturn]] void kernel_exit();
|
2023-05-04 23:43:00 +02:00
|
|
|
|
|
|
|
// Freezes the current thread until someone else calls wake_up() on this thread.
|
|
|
|
void kernel_wait_for_event();
|