Kernel: Allow creationg of empty processes and manual registration

You can now create kernel processes without any threads, add the
needed threads and only then register the process and its threads
to the scheduler.
This commit is contained in:
Bananymous
2023-09-27 00:29:45 +03:00
parent 1d470fb5ba
commit 09c1aa44d8
2 changed files with 15 additions and 8 deletions

View File

@@ -78,22 +78,29 @@ namespace Kernel
return process;
}
void Process::register_process(Process* process)
void Process::register_to_scheduler()
{
s_process_lock.lock();
MUST(s_processes.push_back(process));
MUST(s_processes.push_back(this));
s_process_lock.unlock();
for (auto* thread : process->m_threads)
for (auto* thread : m_threads)
MUST(Scheduler::get().add_thread(thread));
}
Process* Process::create_kernel()
{
auto* process = create_process({ 0, 0, 0, 0 }, 0);
MUST(process->m_working_directory.push_back('/'));
return process;
}
Process* Process::create_kernel(entry_t entry, void* data)
{
auto* process = create_process({ 0, 0, 0, 0 }, 0);
MUST(process->m_working_directory.push_back('/'));
auto* thread = MUST(Thread::create_kernel(entry, data, process));
process->add_thread(thread);
register_process(process);
process->register_to_scheduler();
return process;
}
@@ -146,7 +153,7 @@ namespace Kernel
auto* thread = MUST(Thread::create_userspace(process));
process->add_thread(thread);
register_process(process);
process->register_to_scheduler();
return process;
}
@@ -353,8 +360,7 @@ namespace Kernel
// FIXME: this should be able to fail
Thread* thread = MUST(Thread::current().clone(forked, rsp, rip));
forked->add_thread(thread);
register_process(forked);
forked->register_to_scheduler();
return forked->pid();
}