|
|
|
@ -72,7 +72,7 @@ Result KProcess::Initialize(KProcess* process, Core::System& system, std::string
|
|
|
|
|
|
|
|
|
|
process->name = std::move(process_name);
|
|
|
|
|
process->resource_limit = res_limit;
|
|
|
|
|
process->status = ProcessStatus::Created;
|
|
|
|
|
process->state = State::Created;
|
|
|
|
|
process->program_id = 0;
|
|
|
|
|
process->process_id = type == ProcessType::KernelInternal ? kernel.CreateNewKernelProcessID()
|
|
|
|
|
: kernel.CreateNewUserProcessID();
|
|
|
|
@ -289,7 +289,7 @@ Result KProcess::Reset() {
|
|
|
|
|
KScopedSchedulerLock sl{kernel};
|
|
|
|
|
|
|
|
|
|
// Validate that we're in a state that we can reset.
|
|
|
|
|
R_UNLESS(status != ProcessStatus::Exited, ResultInvalidState);
|
|
|
|
|
R_UNLESS(state != State::Terminated, ResultInvalidState);
|
|
|
|
|
R_UNLESS(is_signaled, ResultInvalidState);
|
|
|
|
|
|
|
|
|
|
// Clear signaled.
|
|
|
|
@ -304,8 +304,8 @@ Result KProcess::SetActivity(ProcessActivity activity) {
|
|
|
|
|
KScopedSchedulerLock sl{kernel};
|
|
|
|
|
|
|
|
|
|
// Validate our state.
|
|
|
|
|
R_UNLESS(status != ProcessStatus::Exiting, ResultInvalidState);
|
|
|
|
|
R_UNLESS(status != ProcessStatus::Exited, ResultInvalidState);
|
|
|
|
|
R_UNLESS(state != State::Terminating, ResultInvalidState);
|
|
|
|
|
R_UNLESS(state != State::Terminated, ResultInvalidState);
|
|
|
|
|
|
|
|
|
|
// Either pause or resume.
|
|
|
|
|
if (activity == ProcessActivity::Paused) {
|
|
|
|
@ -411,13 +411,13 @@ void KProcess::Run(s32 main_thread_priority, u64 stack_size) {
|
|
|
|
|
const std::size_t heap_capacity{memory_usage_capacity - (main_thread_stack_size + image_size)};
|
|
|
|
|
ASSERT(!page_table->SetMaxHeapSize(heap_capacity).IsError());
|
|
|
|
|
|
|
|
|
|
ChangeStatus(ProcessStatus::Running);
|
|
|
|
|
ChangeState(State::Running);
|
|
|
|
|
|
|
|
|
|
SetupMainThread(kernel.System(), *this, main_thread_priority, main_thread_stack_top);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void KProcess::PrepareForTermination() {
|
|
|
|
|
ChangeStatus(ProcessStatus::Exiting);
|
|
|
|
|
ChangeState(State::Terminating);
|
|
|
|
|
|
|
|
|
|
const auto stop_threads = [this](const std::vector<KThread*>& in_thread_list) {
|
|
|
|
|
for (auto* thread : in_thread_list) {
|
|
|
|
@ -445,7 +445,7 @@ void KProcess::PrepareForTermination() {
|
|
|
|
|
main_thread_stack_size + image_size);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ChangeStatus(ProcessStatus::Exited);
|
|
|
|
|
ChangeState(State::Terminated);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void KProcess::Finalize() {
|
|
|
|
@ -652,12 +652,12 @@ KProcess::KProcess(KernelCore& kernel_)
|
|
|
|
|
|
|
|
|
|
KProcess::~KProcess() = default;
|
|
|
|
|
|
|
|
|
|
void KProcess::ChangeStatus(ProcessStatus new_status) {
|
|
|
|
|
if (status == new_status) {
|
|
|
|
|
void KProcess::ChangeState(State new_state) {
|
|
|
|
|
if (state == new_state) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
status = new_status;
|
|
|
|
|
state = new_state;
|
|
|
|
|
is_signaled = true;
|
|
|
|
|
NotifyAvailable();
|
|
|
|
|
}
|
|
|
|
|