summaryrefslogtreecommitdiffstats
path: root/src/kernel/taskmgr.C
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel/taskmgr.C')
-rw-r--r--src/kernel/taskmgr.C40
1 files changed, 37 insertions, 3 deletions
diff --git a/src/kernel/taskmgr.C b/src/kernel/taskmgr.C
index 0ed493801..ad2aa3af5 100644
--- a/src/kernel/taskmgr.C
+++ b/src/kernel/taskmgr.C
@@ -33,6 +33,7 @@
#include <arch/ppc.H>
#include <string.h>
#include <limits.h>
+#include <assert.h>
extern "C" void userspace_task_entry();
@@ -169,13 +170,13 @@ void TaskManager::_endTask(task_t* t, void* retval, int status)
if (getCurrentTask() == t)
t->cpu->scheduler->setNextRunnable();
+ iv_spinlock.lock();
+
// Update status in tracker.
t->tracker->status = status;
t->tracker->retval = retval;
t->tracker->task = NULL; // NULL signifies task is complete for now.
- iv_spinlock.lock();
-
if (t->detached) // If detached, just clean up the tracker.
{
removeTracker(t->tracker);
@@ -207,6 +208,19 @@ void TaskManager::_endTask(task_t* t, void* retval, int status)
parent->task->cpu->scheduler->addTask(parent->task);
}
}
+ else if (!t->tracker->parent) // Parented by kernel.
+ {
+ if (status == TASK_STATUS_CRASHED)
+ {
+ printk("Critical: Parentless task %d crashed.\n",
+ t->tid);
+ kassert(status != TASK_STATUS_CRASHED);
+ }
+ else
+ {
+ removeTracker(t->tracker);
+ }
+ }
}
iv_spinlock.unlock();
@@ -326,7 +340,27 @@ void TaskManager::removeTracker(task_tracking_t* t)
while(task_tracking_t* child = t->children.remove())
{
child->parent = parent;
- trackingList->insert(child);
+ if ((!parent) && (!child->task)) // Deal with finished children
+ // becoming parented by the kernel.
+ {
+ if (child->status == TASK_STATUS_CRASHED)
+ {
+ trackingList->insert(child); // Insert into kernel list so it
+ // is there for debug.
+
+ printk("Critical: Parentless task %d crashed.\n",
+ child->key);
+ kassert(child->status != TASK_STATUS_CRASHED);
+ }
+ else
+ {
+ removeTracker(child);
+ }
+ }
+ else
+ {
+ trackingList->insert(child);
+ }
}
// Delete tracker object.
OpenPOWER on IntegriCloud