Process cleanup should be done by a thread

This commit is contained in:
Alex 2023-03-27 02:50:57 +03:00
parent fe64c55afc
commit 1266764aec
Signed by untrusted user who does not match committer: enderice2
GPG Key ID: EACC3AD603BAB4DD
4 changed files with 39 additions and 52 deletions

View File

@ -178,7 +178,7 @@ void BootLogoAnimationThread()
if (!stbi_info_from_memory((uint8_t *)Frames[i], FrameSizes[i], &x, &y, &channels)) if (!stbi_info_from_memory((uint8_t *)Frames[i], FrameSizes[i], &x, &y, &channels))
continue; continue;
uint8_t *img = stbi_load_from_memory((uint8_t *)Frames[i], FrameSizes[i], &x, &y, &channels, 4); uint8_t *img = stbi_load_from_memory((uint8_t *)Frames[i], FrameSizes[i], &x, &y, &channels, STBI_rgb_alpha);
if (img == NULL) if (img == NULL)
continue; continue;
@ -233,7 +233,7 @@ void ExitLogoAnimationThread()
if (!stbi_info_from_memory((uint8_t *)Frames[i], FrameSizes[i], &x, &y, &channels)) if (!stbi_info_from_memory((uint8_t *)Frames[i], FrameSizes[i], &x, &y, &channels))
continue; continue;
uint8_t *img = stbi_load_from_memory((uint8_t *)Frames[i], FrameSizes[i], &x, &y, &channels, 4); uint8_t *img = stbi_load_from_memory((uint8_t *)Frames[i], FrameSizes[i], &x, &y, &channels, STBI_rgb_alpha);
if (img == NULL) if (img == NULL)
continue; continue;
@ -272,8 +272,13 @@ void ExitLogoAnimationThread()
} }
} }
void CleanupProcessesThreadWrapper() { TaskManager->CleanupProcessesThread(); }
void KernelMainThread() void KernelMainThread()
{ {
Tasking::TCB *clnThd = TaskManager->CreateThread(TaskManager->GetCurrentProcess(), (Tasking::IP)CleanupProcessesThreadWrapper);
clnThd->SetPriority(Tasking::Idle);
TaskManager->SetCleanupThread(clnThd);
TaskManager->GetCurrentThread()->SetPriority(Tasking::Critical); TaskManager->GetCurrentThread()->SetPriority(Tasking::Critical);
Tasking::TCB *blaThread = nullptr; Tasking::TCB *blaThread = nullptr;

View File

@ -270,16 +270,6 @@ namespace Tasking
return false; return false;
} }
SafeFunction NIF void Task::SchedulerCleanupProcesses()
{
foreach (auto process in ListProcess)
{
if (InvalidPCB(process))
continue;
RemoveProcess(process);
}
}
SafeFunction NIF bool Task::SchedulerSearchProcessThread(void *CPUDataPointer) SafeFunction NIF bool Task::SchedulerSearchProcessThread(void *CPUDataPointer)
{ {
CPUData *CurrentCPU = (CPUData *)CPUDataPointer; CPUData *CurrentCPU = (CPUData *)CPUDataPointer;
@ -546,9 +536,6 @@ namespace Tasking
} }
schedbg("Passed GetNextAvailableProcess"); schedbg("Passed GetNextAvailableProcess");
this->SchedulerCleanupProcesses();
schedbg("Passed SchedulerCleanupProcesses");
if (SchedulerSearchProcessThread(CurrentCPU)) if (SchedulerSearchProcessThread(CurrentCPU))
{ {
#ifdef ON_SCREEN_SCHEDULER_TASK_MANAGER #ifdef ON_SCREEN_SCHEDULER_TASK_MANAGER
@ -690,11 +677,6 @@ namespace Tasking
fixme("unimplemented"); fixme("unimplemented");
} }
SafeFunction void Task::SchedulerCleanupProcesses()
{
fixme("unimplemented");
}
SafeFunction bool Task::SchedulerSearchProcessThread(void *CPUDataPointer) SafeFunction bool Task::SchedulerSearchProcessThread(void *CPUDataPointer)
{ {
fixme("unimplemented"); fixme("unimplemented");
@ -722,11 +704,6 @@ namespace Tasking
fixme("unimplemented"); fixme("unimplemented");
} }
SafeFunction void Task::SchedulerCleanupProcesses()
{
fixme("unimplemented");
}
SafeFunction bool Task::SchedulerSearchProcessThread(void *CPUDataPointer) SafeFunction bool Task::SchedulerSearchProcessThread(void *CPUDataPointer)
{ {
fixme("unimplemented"); fixme("unimplemented");

View File

@ -284,6 +284,21 @@ namespace Tasking
// This should hang until all processes are terminated // This should hang until all processes are terminated
} }
void Task::CleanupProcessesThread()
{
while (true)
{
this->Sleep(1000);
foreach (auto process in ListProcess)
{
if (InvalidPCB(process))
continue;
RemoveProcess(process);
}
}
}
void Task::RevertProcessCreation(PCB *Process) void Task::RevertProcessCreation(PCB *Process)
{ {
for (size_t i = 0; i < ListProcess.size(); i++) for (size_t i = 0; i < ListProcess.size(); i++)
@ -837,35 +852,24 @@ namespace Tasking
Task::~Task() Task::~Task()
{ {
debug("Destructor called"); debug("Destructor called");
SmartLock(TaskingLock);
trace("Stopping tasking");
/*size_t ExpectedToBeTerminated = 0;
foreach (PCB *Process in ListProcess)
{ {
foreach (TCB *Thread in Process->Threads) SmartLock(TaskingLock);
foreach (PCB *Process in ListProcess)
{ {
if (Thread == GetCurrentCPU()->CurrentThread.Load()) foreach (TCB *Thread in Process->Threads)
{
if (Thread == GetCurrentCPU()->CurrentThread.Load() ||
Thread == CleanupThread)
continue;
this->KillThread(Thread, 0xFFFF);
}
if (Process == GetCurrentCPU()->CurrentProcess.Load())
continue; continue;
this->KillThread(Thread, 0xFFFF); this->KillProcess(Process, 0xFFFF);
ExpectedToBeTerminated++;
} }
if (Process == GetCurrentCPU()->CurrentProcess.Load())
continue;
this->KillProcess(Process, 0xFFFF);
ExpectedToBeTerminated++;
}*/
foreach (PCB *Process in ListProcess)
{
foreach (TCB *Thread in Process->Threads)
Thread->Status = TaskStatus::Terminated;
Process->Status = TaskStatus::Terminated;
} }
TaskingLock.Unlock();
while (ListProcess.size() > 0) while (ListProcess.size() > 0)
{ {
trace("Waiting for %d processes to terminate", ListProcess.size()); trace("Waiting for %d processes to terminate", ListProcess.size());
@ -877,7 +881,7 @@ namespace Tasking
continue; continue;
NotTerminated++; NotTerminated++;
} }
if (NotTerminated == 0 /*1*/) if (NotTerminated == 1)
break; break;
TaskingScheduler_OneShot(100); TaskingScheduler_OneShot(100);
} }

View File

@ -229,9 +229,10 @@ namespace Tasking
std::vector<PCB *> ListProcess; std::vector<PCB *> ListProcess;
PCB *IdleProcess = nullptr; PCB *IdleProcess = nullptr;
TCB *IdleThread = nullptr; TCB *IdleThread = nullptr;
TCB *CleanupThread = nullptr;
Atomic<uint64_t> SchedulerTicks = 0; Atomic<uint64_t> SchedulerTicks = 0;
Atomic<uint64_t> LastTaskTicks = 0; Atomic<uint64_t> LastTaskTicks = 0;
bool StopScheduler = false;
bool InvalidPCB(PCB *pcb); bool InvalidPCB(PCB *pcb);
bool InvalidTCB(TCB *tcb); bool InvalidTCB(TCB *tcb);
@ -245,7 +246,6 @@ namespace Tasking
bool FindNewProcess(void *CPUDataPointer); bool FindNewProcess(void *CPUDataPointer);
bool GetNextAvailableThread(void *CPUDataPointer); bool GetNextAvailableThread(void *CPUDataPointer);
bool GetNextAvailableProcess(void *CPUDataPointer); bool GetNextAvailableProcess(void *CPUDataPointer);
void SchedulerCleanupProcesses();
bool SchedulerSearchProcessThread(void *CPUDataPointer); bool SchedulerSearchProcessThread(void *CPUDataPointer);
void UpdateProcessStatus(); void UpdateProcessStatus();
void WakeUpThreads(void *CPUDataPointer); void WakeUpThreads(void *CPUDataPointer);
@ -260,13 +260,14 @@ namespace Tasking
void Schedule(void *Frame); void Schedule(void *Frame);
void OnInterruptReceived(void *Frame); void OnInterruptReceived(void *Frame);
#endif #endif
bool StopScheduler = false;
public: public:
void SetCleanupThread(TCB *Thread) { CleanupThread = Thread; }
uint64_t GetSchedulerTicks() { return SchedulerTicks.Load(); } uint64_t GetSchedulerTicks() { return SchedulerTicks.Load(); }
uint64_t GetLastTaskTicks() { return LastTaskTicks.Load(); } uint64_t GetLastTaskTicks() { return LastTaskTicks.Load(); }
std::vector<PCB *> GetProcessList() { return ListProcess; } std::vector<PCB *> GetProcessList() { return ListProcess; }
Security *GetSecurityManager() { return &SecurityManager; } Security *GetSecurityManager() { return &SecurityManager; }
void CleanupProcessesThread();
void Panic() { StopScheduler = true; } void Panic() { StopScheduler = true; }
void Schedule(); void Schedule();
void SignalShutdown(); void SignalShutdown();