mirror of
https://github.com/RGBCube/serenity
synced 2025-05-29 06:55:07 +00:00
Kernel: Simplify Process factory functions
- Instead of taking the first new thread as an out-parameter, we now bundle the process and its first thread in a struct and use that as the return value. - Make all Process factory functions return ErrorOr. Use this to convert some places to more TRY(). - Drop the "try_" prefix on Process factory functions.
This commit is contained in:
parent
65438d8a85
commit
a098266ff5
12 changed files with 319 additions and 78 deletions
|
@ -18,19 +18,18 @@ ErrorOr<FlatPtr> Process::sys$fork(RegisterState& regs)
|
|||
{
|
||||
VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this);
|
||||
TRY(require_promise(Pledge::proc));
|
||||
LockRefPtr<Thread> child_first_thread;
|
||||
|
||||
ArmedScopeGuard thread_finalizer_guard = [&child_first_thread]() {
|
||||
SpinlockLocker lock(g_scheduler_lock);
|
||||
if (child_first_thread) {
|
||||
child_first_thread->detach();
|
||||
child_first_thread->set_state(Thread::State::Dying);
|
||||
}
|
||||
};
|
||||
|
||||
auto child_name = TRY(name().with([](auto& name) { return name->try_clone(); }));
|
||||
auto credentials = this->credentials();
|
||||
auto child = TRY(Process::try_create(child_first_thread, move(child_name), credentials->uid(), credentials->gid(), pid(), m_is_kernel_process, current_directory(), executable(), m_tty, this));
|
||||
auto child_and_first_thread = TRY(Process::create(move(child_name), credentials->uid(), credentials->gid(), pid(), m_is_kernel_process, current_directory(), executable(), m_tty, this));
|
||||
auto& child = child_and_first_thread.process;
|
||||
auto& child_first_thread = child_and_first_thread.first_thread;
|
||||
|
||||
ArmedScopeGuard thread_finalizer_guard = [&child_first_thread]() {
|
||||
SpinlockLocker lock(g_scheduler_lock);
|
||||
child_first_thread->detach();
|
||||
child_first_thread->set_state(Thread::State::Dying);
|
||||
};
|
||||
|
||||
// NOTE: All user processes have a leaked ref on them. It's balanced by Thread::WaitBlockerSet::finalize().
|
||||
child->ref();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue