From 0d03f507d4952bc2f2c746ee60dcd155ba4ea507 Mon Sep 17 00:00:00 2001 From: Patrick Williams Date: Fri, 28 Oct 2011 17:02:22 -0500 Subject: Assert on crash of a parent-less task. - Assert whenever a parent-less task crashes. - Clean up task structures for parent-less tasks. Change-Id: Idf613cbbd51e6ec87e5c1455c30b3051096ed807 Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/468 Tested-by: Jenkins Server Reviewed-by: Douglas R. Gilbert Reviewed-by: Melissa J. Connell Reviewed-by: A. Patrick Williams III --- src/kernel/taskmgr.C | 40 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 37 insertions(+), 3 deletions(-) (limited to 'src/kernel') 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 #include #include +#include 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. -- cgit v1.2.3