mirror of
https://github.com/Fennix-Project/Kernel.git
synced 2025-07-11 15:29:18 +00:00
Implement std::atomic and remove the old implementation Atomic and rename vector.hpp to vector
This commit is contained in:
@ -124,12 +124,12 @@ namespace Tasking
|
||||
SafeFunction NIF bool Task::FindNewProcess(void *CPUDataPointer)
|
||||
{
|
||||
CPUData *CurrentCPU = (CPUData *)CPUDataPointer;
|
||||
fnp_schedbg("%d processes", ListProcess.size());
|
||||
fnp_schedbg("%d processes", ProcessList.size());
|
||||
#ifdef DEBUG_FIND_NEW_PROCESS
|
||||
foreach (auto process in ListProcess)
|
||||
foreach (auto process in ProcessList)
|
||||
fnp_schedbg("Process %d %s", process->ID, process->Name);
|
||||
#endif
|
||||
foreach (auto process in ListProcess)
|
||||
foreach (auto process in ProcessList)
|
||||
{
|
||||
if (InvalidPCB(process))
|
||||
continue;
|
||||
@ -179,7 +179,7 @@ namespace Tasking
|
||||
|
||||
for (size_t i = 0; i < CurrentCPU->CurrentProcess->Threads.size(); i++)
|
||||
{
|
||||
if (CurrentCPU->CurrentProcess->Threads[i] == CurrentCPU->CurrentThread.Load())
|
||||
if (CurrentCPU->CurrentProcess->Threads[i] == CurrentCPU->CurrentThread.load())
|
||||
{
|
||||
size_t TempIndex = i;
|
||||
RetryAnotherThread:
|
||||
@ -213,7 +213,7 @@ namespace Tasking
|
||||
CurrentCPU->CurrentThread = nextThread;
|
||||
gnat_schedbg("[thd 0 -> end] Scheduling thread %d parent of %s->%d Procs %d",
|
||||
thread->ID, thread->Parent->Name,
|
||||
CurrentCPU->CurrentProcess->Threads.size(), ListProcess.size());
|
||||
CurrentCPU->CurrentProcess->Threads.size(), ProcessList.size());
|
||||
return true;
|
||||
}
|
||||
#ifdef DEBUG
|
||||
@ -232,9 +232,9 @@ namespace Tasking
|
||||
CPUData *CurrentCPU = (CPUData *)CPUDataPointer;
|
||||
|
||||
bool Skip = true;
|
||||
foreach (auto process in ListProcess)
|
||||
foreach (auto process in ProcessList)
|
||||
{
|
||||
if (process == CurrentCPU->CurrentProcess.Load())
|
||||
if (process == CurrentCPU->CurrentProcess.load())
|
||||
{
|
||||
Skip = false;
|
||||
gnap_schedbg("Found current process %#lx", process);
|
||||
@ -279,7 +279,7 @@ namespace Tasking
|
||||
CurrentCPU->CurrentProcess = process;
|
||||
CurrentCPU->CurrentThread = thread;
|
||||
gnap_schedbg("[cur proc+1 -> first thd] Scheduling thread %d %s->%d (Total Procs %d)",
|
||||
thread->ID, thread->Name, process->Threads.size(), ListProcess.size());
|
||||
thread->ID, thread->Name, process->Threads.size(), ProcessList.size());
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@ -291,7 +291,7 @@ namespace Tasking
|
||||
{
|
||||
CPUData *CurrentCPU = (CPUData *)CPUDataPointer;
|
||||
|
||||
foreach (auto process in ListProcess)
|
||||
foreach (auto process in ProcessList)
|
||||
{
|
||||
if (InvalidPCB(process))
|
||||
{
|
||||
@ -325,7 +325,7 @@ namespace Tasking
|
||||
CurrentCPU->CurrentProcess = process;
|
||||
CurrentCPU->CurrentThread = thread;
|
||||
sspt_schedbg("[proc 0 -> end -> first thd] Scheduling thread %d parent of %s->%d (Procs %d)",
|
||||
thread->ID, thread->Parent->Name, process->Threads.size(), ListProcess.size());
|
||||
thread->ID, thread->Parent->Name, process->Threads.size(), ProcessList.size());
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@ -334,7 +334,7 @@ namespace Tasking
|
||||
|
||||
SafeFunction NIF void Task::UpdateProcessStatus()
|
||||
{
|
||||
foreach (auto process in ListProcess)
|
||||
foreach (auto process in ProcessList)
|
||||
{
|
||||
if (InvalidPCB(process))
|
||||
continue;
|
||||
@ -363,7 +363,7 @@ namespace Tasking
|
||||
SafeFunction NIF void Task::WakeUpThreads(void *CPUDataPointer)
|
||||
{
|
||||
CPUData *CurrentCPU = (CPUData *)CPUDataPointer;
|
||||
foreach (auto process in ListProcess)
|
||||
foreach (auto process in ProcessList)
|
||||
{
|
||||
if (InvalidPCB(process))
|
||||
continue;
|
||||
@ -479,7 +479,7 @@ namespace Tasking
|
||||
}
|
||||
CPU::x64::writecr3({.raw = (uint64_t)KernelPageTable}); /* Restore kernel page table for safety reasons. */
|
||||
uint64_t SchedTmpTicks = CPU::Counter();
|
||||
this->LastTaskTicks.Store(SchedTmpTicks - this->SchedulerTicks.Load());
|
||||
this->LastTaskTicks.store(SchedTmpTicks - this->SchedulerTicks.load());
|
||||
CPUData *CurrentCPU = GetCurrentCPU();
|
||||
schedbg("Scheduler called on CPU %d.", CurrentCPU->ID);
|
||||
schedbg("%d: %ld%%", CurrentCPU->ID, GetUsage(CurrentCPU->ID));
|
||||
@ -509,7 +509,7 @@ namespace Tasking
|
||||
}
|
||||
#endif
|
||||
|
||||
if (unlikely(InvalidPCB(CurrentCPU->CurrentProcess.Load()) || InvalidTCB(CurrentCPU->CurrentThread.Load())))
|
||||
if (unlikely(InvalidPCB(CurrentCPU->CurrentProcess.load()) || InvalidTCB(CurrentCPU->CurrentThread.load())))
|
||||
{
|
||||
schedbg("Invalid process or thread. Finding a new one.");
|
||||
if (this->FindNewProcess(CurrentCPU))
|
||||
@ -669,7 +669,7 @@ namespace Tasking
|
||||
|
||||
/* RealEnd->[Function Exit] */
|
||||
RealEnd:
|
||||
this->SchedulerTicks.Store(CPU::Counter() - SchedTmpTicks);
|
||||
this->SchedulerTicks.store(CPU::Counter() - SchedTmpTicks);
|
||||
__sync; /* TODO: Is this really needed? */
|
||||
}
|
||||
|
||||
|
@ -17,9 +17,9 @@
|
||||
|
||||
#include <task.hpp>
|
||||
|
||||
#include <vector.hpp>
|
||||
#include <rand.hpp>
|
||||
#include <debug.h>
|
||||
#include <vector>
|
||||
|
||||
namespace Tasking
|
||||
{
|
||||
|
@ -130,36 +130,36 @@ namespace Tasking
|
||||
foreach (PCB *process in Process->Children)
|
||||
RemoveProcess(process);
|
||||
|
||||
for (size_t i = 0; i < ListProcess.size(); i++)
|
||||
for (size_t i = 0; i < ProcessList.size(); i++)
|
||||
{
|
||||
if (ListProcess[i] == Process)
|
||||
if (ProcessList[i] == Process)
|
||||
{
|
||||
trace("Process \"%s\"(%d) removed from the list", Process->Name, Process->ID);
|
||||
// Free memory
|
||||
delete ListProcess[i]->IPC, ListProcess[i]->IPC = nullptr;
|
||||
delete ListProcess[i]->ELFSymbolTable, ListProcess[i]->ELFSymbolTable = nullptr;
|
||||
SecurityManager.DestroyToken(ListProcess[i]->Security.UniqueToken);
|
||||
if (ListProcess[i]->Security.TrustLevel == TaskTrustLevel::User)
|
||||
KernelAllocator.FreePages((void *)ListProcess[i]->PageTable, TO_PAGES(sizeof(Memory::PageTable4) + 1));
|
||||
delete ProcessList[i]->IPC, ProcessList[i]->IPC = nullptr;
|
||||
delete ProcessList[i]->ELFSymbolTable, ProcessList[i]->ELFSymbolTable = nullptr;
|
||||
SecurityManager.DestroyToken(ProcessList[i]->Security.UniqueToken);
|
||||
if (ProcessList[i]->Security.TrustLevel == TaskTrustLevel::User)
|
||||
KernelAllocator.FreePages((void *)ProcessList[i]->PageTable, TO_PAGES(sizeof(Memory::PageTable4) + 1));
|
||||
|
||||
// Remove the process from parent's children list
|
||||
if (ListProcess[i]->Parent)
|
||||
for (size_t j = 0; j < ListProcess[i]->Parent->Children.size(); j++)
|
||||
if (ProcessList[i]->Parent)
|
||||
for (size_t j = 0; j < ProcessList[i]->Parent->Children.size(); j++)
|
||||
{
|
||||
if (ListProcess[i]->Parent->Children[j] == ListProcess[i])
|
||||
if (ProcessList[i]->Parent->Children[j] == ProcessList[i])
|
||||
{
|
||||
ListProcess[i]->Parent->Children.remove(j);
|
||||
ProcessList[i]->Parent->Children.remove(j);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Delete process directory
|
||||
vfs->Delete(ListProcess[i]->ProcessDirectory, true);
|
||||
vfs->Delete(ProcessList[i]->ProcessDirectory, true);
|
||||
|
||||
// Free memory
|
||||
delete ListProcess[i], ListProcess[i] = nullptr;
|
||||
delete ProcessList[i], ProcessList[i] = nullptr;
|
||||
// Remove from the list
|
||||
ListProcess.remove(i);
|
||||
ProcessList.remove(i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -217,23 +217,23 @@ namespace Tasking
|
||||
CPU::Halt(true);
|
||||
}
|
||||
|
||||
PCB *Task::GetCurrentProcess() { return GetCurrentCPU()->CurrentProcess.Load(); }
|
||||
TCB *Task::GetCurrentThread() { return GetCurrentCPU()->CurrentThread.Load(); }
|
||||
PCB *Task::GetCurrentProcess() { return GetCurrentCPU()->CurrentProcess.load(); }
|
||||
TCB *Task::GetCurrentThread() { return GetCurrentCPU()->CurrentThread.load(); }
|
||||
|
||||
PCB *Task::GetProcessByID(UPID ID)
|
||||
{
|
||||
for (size_t i = 0; i < ListProcess.size(); i++)
|
||||
if (ListProcess[i]->ID == ID)
|
||||
return ListProcess[i];
|
||||
for (size_t i = 0; i < ProcessList.size(); i++)
|
||||
if (ProcessList[i]->ID == ID)
|
||||
return ProcessList[i];
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
TCB *Task::GetThreadByID(UTID ID)
|
||||
{
|
||||
for (size_t i = 0; i < ListProcess.size(); i++)
|
||||
for (size_t j = 0; j < ListProcess[i]->Threads.size(); j++)
|
||||
if (ListProcess[i]->Threads[j]->ID == ID)
|
||||
return ListProcess[i]->Threads[j];
|
||||
for (size_t i = 0; i < ProcessList.size(); i++)
|
||||
for (size_t j = 0; j < ProcessList[i]->Threads.size(); j++)
|
||||
if (ProcessList[i]->Threads[j]->ID == ID)
|
||||
return ProcessList[i]->Threads[j];
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
@ -312,7 +312,7 @@ namespace Tasking
|
||||
while (true)
|
||||
{
|
||||
this->Sleep(1000);
|
||||
foreach (auto process in ListProcess)
|
||||
foreach (auto process in ProcessList)
|
||||
{
|
||||
if (InvalidPCB(process))
|
||||
continue;
|
||||
@ -324,9 +324,9 @@ namespace Tasking
|
||||
|
||||
void Task::RevertProcessCreation(PCB *Process)
|
||||
{
|
||||
for (size_t i = 0; i < ListProcess.size(); i++)
|
||||
for (size_t i = 0; i < ProcessList.size(); i++)
|
||||
{
|
||||
if (ListProcess[i] == Process)
|
||||
if (ProcessList[i] == Process)
|
||||
{
|
||||
SecurityManager.DestroyToken(Process->Security.UniqueToken);
|
||||
if (Process->Security.TrustLevel == TaskTrustLevel::User)
|
||||
@ -345,7 +345,7 @@ namespace Tasking
|
||||
delete Process->IPC, Process->IPC = nullptr;
|
||||
delete Process->ELFSymbolTable, Process->ELFSymbolTable = nullptr;
|
||||
delete Process, Process = nullptr;
|
||||
ListProcess.remove(i);
|
||||
ProcessList.remove(i);
|
||||
NextPID--;
|
||||
break;
|
||||
}
|
||||
@ -769,7 +769,7 @@ namespace Tasking
|
||||
|
||||
if (Parent)
|
||||
Parent->Children.push_back(Process);
|
||||
ListProcess.push_back(Process);
|
||||
ProcessList.push_back(Process);
|
||||
return Process;
|
||||
}
|
||||
|
||||
@ -859,27 +859,27 @@ namespace Tasking
|
||||
debug("Destructor called");
|
||||
{
|
||||
SmartLock(TaskingLock);
|
||||
foreach (PCB *Process in ListProcess)
|
||||
foreach (PCB *Process in ProcessList)
|
||||
{
|
||||
foreach (TCB *Thread in Process->Threads)
|
||||
{
|
||||
if (Thread == GetCurrentCPU()->CurrentThread.Load() ||
|
||||
if (Thread == GetCurrentCPU()->CurrentThread.load() ||
|
||||
Thread == CleanupThread)
|
||||
continue;
|
||||
this->KillThread(Thread, 0xFFFF);
|
||||
}
|
||||
|
||||
if (Process == GetCurrentCPU()->CurrentProcess.Load())
|
||||
if (Process == GetCurrentCPU()->CurrentProcess.load())
|
||||
continue;
|
||||
this->KillProcess(Process, 0xFFFF);
|
||||
}
|
||||
}
|
||||
|
||||
while (ListProcess.size() > 0)
|
||||
while (ProcessList.size() > 0)
|
||||
{
|
||||
trace("Waiting for %d processes to terminate", ListProcess.size());
|
||||
trace("Waiting for %d processes to terminate", ProcessList.size());
|
||||
int NotTerminated = 0;
|
||||
foreach (PCB *Process in ListProcess)
|
||||
foreach (PCB *Process in ProcessList)
|
||||
{
|
||||
debug("Process %s(%d) is still running (or waiting to be removed status %#lx)", Process->Name, Process->ID, Process->Status);
|
||||
if (Process->Status == TaskStatus::Terminated)
|
||||
|
Reference in New Issue
Block a user