forked from Bananymous/banan-os
update main #1
|
@ -38,11 +38,13 @@ namespace Kernel
|
||||||
};
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
static Process* create_kernel();
|
||||||
static Process* create_kernel(entry_t, void*);
|
static Process* create_kernel(entry_t, void*);
|
||||||
static BAN::ErrorOr<Process*> create_userspace(const Credentials&, BAN::StringView);
|
static BAN::ErrorOr<Process*> create_userspace(const Credentials&, BAN::StringView);
|
||||||
~Process();
|
~Process();
|
||||||
void cleanup_function();
|
void cleanup_function();
|
||||||
|
|
||||||
|
void register_to_scheduler();
|
||||||
void exit(int status, int signal);
|
void exit(int status, int signal);
|
||||||
|
|
||||||
static void for_each_process(const BAN::Function<BAN::Iteration(Process&)>& callback);
|
static void for_each_process(const BAN::Function<BAN::Iteration(Process&)>& callback);
|
||||||
|
@ -138,7 +140,6 @@ namespace Kernel
|
||||||
private:
|
private:
|
||||||
Process(const Credentials&, pid_t pid, pid_t parent, pid_t sid, pid_t pgrp);
|
Process(const Credentials&, pid_t pid, pid_t parent, pid_t sid, pid_t pgrp);
|
||||||
static Process* create_process(const Credentials&, pid_t parent, pid_t sid = 0, pid_t pgrp = 0);
|
static Process* create_process(const Credentials&, pid_t parent, pid_t sid = 0, pid_t pgrp = 0);
|
||||||
static void register_process(Process*);
|
|
||||||
|
|
||||||
// Load an elf file to virtual address space of the current page table
|
// Load an elf file to virtual address space of the current page table
|
||||||
static BAN::ErrorOr<BAN::UniqPtr<LibELF::ELF>> load_elf_for_exec(const Credentials&, BAN::StringView file_path, const BAN::String& cwd);
|
static BAN::ErrorOr<BAN::UniqPtr<LibELF::ELF>> load_elf_for_exec(const Credentials&, BAN::StringView file_path, const BAN::String& cwd);
|
||||||
|
|
|
@ -78,22 +78,29 @@ namespace Kernel
|
||||||
return process;
|
return process;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Process::register_process(Process* process)
|
void Process::register_to_scheduler()
|
||||||
{
|
{
|
||||||
s_process_lock.lock();
|
s_process_lock.lock();
|
||||||
MUST(s_processes.push_back(process));
|
MUST(s_processes.push_back(this));
|
||||||
s_process_lock.unlock();
|
s_process_lock.unlock();
|
||||||
for (auto* thread : process->m_threads)
|
for (auto* thread : m_threads)
|
||||||
MUST(Scheduler::get().add_thread(thread));
|
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)
|
Process* Process::create_kernel(entry_t entry, void* data)
|
||||||
{
|
{
|
||||||
auto* process = create_process({ 0, 0, 0, 0 }, 0);
|
auto* process = create_process({ 0, 0, 0, 0 }, 0);
|
||||||
MUST(process->m_working_directory.push_back('/'));
|
MUST(process->m_working_directory.push_back('/'));
|
||||||
auto* thread = MUST(Thread::create_kernel(entry, data, process));
|
auto* thread = MUST(Thread::create_kernel(entry, data, process));
|
||||||
process->add_thread(thread);
|
process->add_thread(thread);
|
||||||
register_process(process);
|
process->register_to_scheduler();
|
||||||
return process;
|
return process;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -146,7 +153,7 @@ namespace Kernel
|
||||||
|
|
||||||
auto* thread = MUST(Thread::create_userspace(process));
|
auto* thread = MUST(Thread::create_userspace(process));
|
||||||
process->add_thread(thread);
|
process->add_thread(thread);
|
||||||
register_process(process);
|
process->register_to_scheduler();
|
||||||
return process;
|
return process;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -353,8 +360,7 @@ namespace Kernel
|
||||||
// FIXME: this should be able to fail
|
// FIXME: this should be able to fail
|
||||||
Thread* thread = MUST(Thread::current().clone(forked, rsp, rip));
|
Thread* thread = MUST(Thread::current().clone(forked, rsp, rip));
|
||||||
forked->add_thread(thread);
|
forked->add_thread(thread);
|
||||||
|
forked->register_to_scheduler();
|
||||||
register_process(forked);
|
|
||||||
|
|
||||||
return forked->pid();
|
return forked->pid();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue