summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--dev/ZKAKit/HALKit/AMD64/HalKernelMain.cc4
-rw-r--r--dev/ZKAKit/KernelKit/UserProcessScheduler.h6
-rw-r--r--dev/ZKAKit/src/CodeMgr.cc10
-rw-r--r--dev/ZKAKit/src/PEFCodeMgr.cc24
-rw-r--r--dev/ZKAKit/src/UserProcessScheduler.cc74
-rw-r--r--dev/ZKAKit/src/UserProcessTeam.cc2
6 files changed, 67 insertions, 53 deletions
diff --git a/dev/ZKAKit/HALKit/AMD64/HalKernelMain.cc b/dev/ZKAKit/HALKit/AMD64/HalKernelMain.cc
index ce440b2f..3cff28d2 100644
--- a/dev/ZKAKit/HALKit/AMD64/HalKernelMain.cc
+++ b/dev/ZKAKit/HALKit/AMD64/HalKernelMain.cc
@@ -18,13 +18,13 @@ EXTERN_C Kernel::VoidPtr mp_user_switch_proc;
EXTERN_C Kernel::Char mp_user_switch_proc_stack_begin[];
EXTERN_C Kernel::MainKind __CTOR_LIST__[];
-EXTERN_C Kernel::MainKind __DTOR_LIST__[];
+EXTERN_C Kernel::VoidPtr __DTOR_LIST__;
EXTERN_C Kernel::Void ke_dll_entrypoint(Kernel::Void);
STATIC Kernel::Void hal_init_cxx_ctors()
{
- for (Kernel::SizeT index = 0UL; __CTOR_LIST__[index] != __DTOR_LIST__[0]; ++index)
+ for (Kernel::SizeT index = 0UL; __CTOR_LIST__[index] != __DTOR_LIST__; ++index)
{
Kernel::MainKind constructor_cxx = (Kernel::MainKind)__CTOR_LIST__[index];
constructor_cxx();
diff --git a/dev/ZKAKit/KernelKit/UserProcessScheduler.h b/dev/ZKAKit/KernelKit/UserProcessScheduler.h
index a974fa3a..c1dd7711 100644
--- a/dev/ZKAKit/KernelKit/UserProcessScheduler.h
+++ b/dev/ZKAKit/KernelKit/UserProcessScheduler.h
@@ -259,12 +259,12 @@ namespace Kernel
ZKA_COPY_DEFAULT(UserProcessTeam);
- Array<UserProcess, kSchedProcessLimitPerTeam>& AsArray();
+ Array<UserProcess*, kSchedProcessLimitPerTeam>& AsArray();
Ref<UserProcess>& AsRef();
ProcessID& Id() noexcept;
public:
- Array<UserProcess, kSchedProcessLimitPerTeam> mProcessList;
+ Array<UserProcess*, kSchedProcessLimitPerTeam> mProcessList;
Ref<UserProcess> mCurrentProcess;
ProcessID mTeamId{0};
};
@@ -316,7 +316,7 @@ namespace Kernel
{
public:
STATIC Bool Switch(VoidPtr image_ptr, UInt8* stack_ptr, HAL::StackFramePtr frame_ptr, const PID& new_pid);
- STATIC Bool CanBeScheduled(const UserProcess& process);
+ STATIC Bool CanBeScheduled(const UserProcess* process);
STATIC ErrorOr<PID> TheCurrentPID();
STATIC SizeT StartScheduling();
};
diff --git a/dev/ZKAKit/src/CodeMgr.cc b/dev/ZKAKit/src/CodeMgr.cc
index 0133d653..f33ed3bf 100644
--- a/dev/ZKAKit/src/CodeMgr.cc
+++ b/dev/ZKAKit/src/CodeMgr.cc
@@ -16,21 +16,23 @@ namespace Kernel
/// @return if the process was started or not.
ProcessID rtl_create_process(MainKind main, const Char* process_name) noexcept
{
- if (!main ||
- !process_name ||
- *process_name == 0)
+ if (*process_name == 0)
return kProcessInvalidID;
UserProcess* process_hdr = new UserProcess();
process_hdr->Image.fCode = reinterpret_cast<VoidPtr>(main);
process_hdr->Kind = UserProcess::kExectuableKind;
- process_hdr->StackSize = kib_cast(16);
+ process_hdr->StackSize = kib_cast(8);
rt_set_memory(process_hdr->Name, 0, kProcessNameLen);
+ rt_copy_memory((VoidPtr)process_name, process_hdr->Name, rt_string_len(process_name) + 1);
ProcessID id = UserProcessScheduler::The().Spawn(process_hdr);
+ if (id == kProcessInvalidID)
+ delete process_hdr;
+
return id;
}
} // namespace Kernel
diff --git a/dev/ZKAKit/src/PEFCodeMgr.cc b/dev/ZKAKit/src/PEFCodeMgr.cc
index 5bdef56d..43efa00a 100644
--- a/dev/ZKAKit/src/PEFCodeMgr.cc
+++ b/dev/ZKAKit/src/PEFCodeMgr.cc
@@ -253,27 +253,27 @@ namespace Kernel
if (errOrStart.Error() != kErrorSuccess)
return kProcessInvalidID;
- STATIC UserProcess proc;
+ UserProcess* proc = new UserProcess();
- proc.Kind = procKind;
- proc.Image.fCode = errOrStart.Leak().Leak();
- proc.Image.fBlob = exec.GetBlob().Leak().Leak();
- proc.StackSize = *(UIntPtr*)exec.FindSymbol(kPefStackSizeSymbol, kPefData);
- proc.MemoryLimit = *(UIntPtr*)exec.FindSymbol(kPefHeapSizeSymbol, kPefData);
- proc.PTime = 0UL;
+ proc->Kind = procKind;
+ proc->Image.fCode = errOrStart.Leak().Leak();
+ proc->Image.fBlob = exec.GetBlob().Leak().Leak();
+ proc->StackSize = *(UIntPtr*)exec.FindSymbol(kPefStackSizeSymbol, kPefData);
+ proc->MemoryLimit = *(UIntPtr*)exec.FindSymbol(kPefHeapSizeSymbol, kPefData);
+ proc->PTime = 0UL;
- rt_set_memory(proc.Name, 0, kProcessNameLen);
+ rt_set_memory(proc->Name, 0, kProcessNameLen);
if (exec.FindSymbol(kPefNameSymbol, kPefData))
- rt_copy_memory(exec.FindSymbol(kPefNameSymbol, kPefData), proc.Name, rt_string_len((Char*)exec.FindSymbol(kPefNameSymbol, kPefData)));
+ rt_copy_memory(exec.FindSymbol(kPefNameSymbol, kPefData), proc->Name, rt_string_len((Char*)exec.FindSymbol(kPefNameSymbol, kPefData)));
- if (!proc.StackSize)
+ if (!proc->StackSize)
{
const auto kDefaultStackSizeMib = 8;
- proc.StackSize = mib_cast(kDefaultStackSizeMib);
+ proc->StackSize = mib_cast(kDefaultStackSizeMib);
}
- return UserProcessScheduler::The().Spawn(&proc);
+ return UserProcessScheduler::The().Spawn(proc);
}
} // namespace Utils
} // namespace Kernel
diff --git a/dev/ZKAKit/src/UserProcessScheduler.cc b/dev/ZKAKit/src/UserProcessScheduler.cc
index b2d27259..906e9a0a 100644
--- a/dev/ZKAKit/src/UserProcessScheduler.cc
+++ b/dev/ZKAKit/src/UserProcessScheduler.cc
@@ -52,7 +52,7 @@ namespace Kernel
}
/***********************************************************************************/
- /// @brief Crashes the current process.
+ /// @brief Crashes the current process->
/***********************************************************************************/
Void UserProcess::Crash()
@@ -94,7 +94,7 @@ namespace Kernel
}
/***********************************************************************************/
- /// @brief Wake process.
+ /// @brief Wake process->
/***********************************************************************************/
Void UserProcess::Wake(const bool should_wakeup)
@@ -159,7 +159,7 @@ namespace Kernel
}
/***********************************************************************************/
- /// @brief Gets the name of the current process.
+ /// @brief Gets the name of the current process->
/***********************************************************************************/
const Char* UserProcess::GetName() noexcept
@@ -168,7 +168,7 @@ namespace Kernel
}
/***********************************************************************************/
- /// @brief Gets the owner of the process.
+ /// @brief Gets the owner of the process->
/***********************************************************************************/
const User* UserProcess::GetOwner() noexcept
@@ -184,7 +184,7 @@ namespace Kernel
/***********************************************************************************/
/**
- @brief Affinity is the time slot allowed for the process.
+ @brief Affinity is the time slot allowed for the process->
*/
/***********************************************************************************/
@@ -269,8 +269,9 @@ namespace Kernel
mm_delete_heap(reinterpret_cast<VoidPtr>(this->StackReserve));
this->ProcessId = 0;
+ this->Status = ProcessStatusKind::kFinished;
- this->Status = ProcessStatusKind::kFinished;
+ delete this;
}
/***********************************************************************************/
@@ -281,8 +282,7 @@ namespace Kernel
ProcessID UserProcessScheduler::Spawn(UserProcess* process)
{
- if (!process ||
- *process->Name == 0)
+ if (!process)
{
return kProcessInvalidID;
}
@@ -334,18 +334,30 @@ namespace Kernel
kcout << "Create stack reserve for: " << process->Name << endl;
- auto pid = mTeam.mProcessList.Capacity() - kSchedProcessLimitPerTeam;
+ ProcessID pid = kProcessInvalidID;
+
+ for (SizeT free_pid = 0UL; free_pid < kSchedProcessLimitPerTeam; ++free_pid)
+ {
+ if (mTeam.mProcessList[free_pid] && mm_is_valid_heap(mTeam.mProcessList[free_pid]) && mTeam.mProcessList[free_pid]->Status == ProcessStatusKind::kFinished)
+ {
+ pid = free_pid;
+ break;
+ }
+ }
+
+ if (pid == kProcessInvalidID)
+ return pid;
process->ProcessId = pid;
process->Status = ProcessStatusKind::kRunning;
process->PTime = (UIntPtr)AffinityKind::kStandard;
- mTeam.mProcessList.Assign(pid, *process);
+ kcout << "Process Name: " << process->Name << endl;
+ kcout << "PID: " << number(process->ProcessId) << endl;
- kcout << "Process Name: " << mTeam.mProcessList[pid].Name << endl;
- kcout << "PID: " << number(mTeam.mProcessList[pid].ProcessId) << endl;
+ mTeam.mProcessList.Assign(pid, process);
- return pid;
+ return process->ProcessId;
}
/***********************************************************************************/
@@ -372,7 +384,7 @@ namespace Kernel
if (process_id > mTeam.mProcessList.Count())
return No;
- mTeam.mProcessList[process_id].Exit(0);
+ mTeam.mProcessList[process_id]->Exit(0);
return Yes;
}
@@ -418,25 +430,25 @@ namespace Kernel
auto process = mTeam.AsArray()[process_index];
//! check if process needs to be scheduled.
- if (UserProcessHelper::CanBeScheduled(process))
+ if (process && UserProcessHelper::CanBeScheduled(process))
{
// Set current process header.
this->GetCurrentProcess() = process;
- process.PTime = static_cast<Int32>(process.Affinity);
+ process->PTime = static_cast<Int32>(process->Affinity);
- kcout << "Switch to '" << process.Name << "'.\r";
+ kcout << "Switch to '" << process->Name << "'.\r";
// tell helper to find a core to schedule on.
- if (!UserProcessHelper::Switch(process.Image.fCode, &process.StackReserve[process.StackSize - 1], process.StackFrame,
- process.ProcessId))
+ if (!UserProcessHelper::Switch(process->Image.fCode, &process->StackReserve[process->StackSize - 1], process->StackFrame,
+ process->ProcessId))
{
- process.Crash();
+ process->Crash();
}
}
else
{
- --process.PTime;
+ --process->PTime;
}
}
@@ -452,7 +464,7 @@ namespace Kernel
/// @internal
- /// @brief Gets current running process.
+ /// @brief Gets current running process->
/// @return
Ref<UserProcess>& UserProcessScheduler::GetCurrentProcess()
{
@@ -474,23 +486,23 @@ namespace Kernel
/// @param process the process reference.
/// @retval true can be schedulded.
/// @retval false cannot be schedulded.
- Bool UserProcessHelper::CanBeScheduled(const UserProcess& process)
+ Bool UserProcessHelper::CanBeScheduled(const UserProcess* process)
{
- if (process.Status == ProcessStatusKind::kKilled ||
- process.Status == ProcessStatusKind::kFinished ||
- process.Status == ProcessStatusKind::kFrozen)
+ if (process->Status == ProcessStatusKind::kKilled ||
+ process->Status == ProcessStatusKind::kFinished ||
+ process->Status == ProcessStatusKind::kFrozen)
return No;
- if (process.Status == ProcessStatusKind::kInvalid)
+ if (process->Status == ProcessStatusKind::kInvalid)
return No;
- if (!process.Image.fCode)
+ if (!process->Image.fCode)
return No;
- if (!process.Name[0])
+ if (!process->Name[0])
return No;
- return process.PTime < 1;
+ return process->PTime < 1;
}
/***********************************************************************************/
@@ -540,7 +552,7 @@ namespace Kernel
////////////////////////////////////////////////////////////
auto prev_ptime = HardwareThreadScheduler::The()[index].Leak()->fPTime;
- HardwareThreadScheduler::The()[index].Leak()->fPTime = UserProcessScheduler::The().CurrentTeam().AsArray()[new_pid].PTime;
+ HardwareThreadScheduler::The()[index].Leak()->fPTime = UserProcessScheduler::The().CurrentTeam().AsArray()[new_pid]->PTime;
Bool ret = HardwareThreadScheduler::The()[index].Leak()->Switch(image_ptr, stack, frame_ptr, new_pid);
////////////////////////////////////////////////////////////
diff --git a/dev/ZKAKit/src/UserProcessTeam.cc b/dev/ZKAKit/src/UserProcessTeam.cc
index 8ebeb395..5899f198 100644
--- a/dev/ZKAKit/src/UserProcessTeam.cc
+++ b/dev/ZKAKit/src/UserProcessTeam.cc
@@ -18,7 +18,7 @@ namespace Kernel
/// @return The list of process to schedule.
/***********************************************************************************/
- Array<UserProcess, kSchedProcessLimitPerTeam>& UserProcessTeam::AsArray()
+ Array<UserProcess*, kSchedProcessLimitPerTeam>& UserProcessTeam::AsArray()
{
return mProcessList;
}