Actually destroy tasks after they crash.

This commit is contained in:
Andreas Kling 2018-10-18 00:26:30 +02:00
parent 1a801e5737
commit 9d5de91cf3
Notes: sideshowbarker 2024-07-19 18:46:36 +09:00
3 changed files with 20 additions and 7 deletions

View file

@ -169,10 +169,26 @@ Task::Task(void (*e)(), const char* n, IPC::Handle h, RingLevel ring)
Task::~Task()
{
system.nprocess--;
delete [] m_ldtEntries;
m_ldtEntries = nullptr;
}
void Task::taskDidCrash(Task* crashedTask)
{
crashedTask->setState(Crashing);
s_tasks->remove(crashedTask);
if (!scheduleNewTask()) {
kprintf("Task::taskDidCrash: Failed to schedule a new task :(\n");
HANG;
}
delete crashedTask;
switchNow();
}
void yield()
{
if (!current) {

View file

@ -95,6 +95,8 @@ public:
static void initialize();
void setError(int);
static void taskDidCrash(Task*);
private:
FileHandle* openFile(String&&);

View file

@ -84,13 +84,8 @@ void exception_13_handler()
HANG;
}
current->setState(Task::Crashing);
if (!scheduleNewTask()) {
kprintf("Failed to schedule a new task :(\n");
HANG;
}
switchNow();
// NOTE: This will schedule a new task.
Task::taskDidCrash(current);
}
#define EH(i, msg) \