diff options
| author | Patrick Williams <iawillia@us.ibm.com> | 2011-10-28 17:02:22 -0500 |
|---|---|---|
| committer | A. Patrick Williams III <iawillia@us.ibm.com> | 2011-11-01 15:15:33 -0500 |
| commit | 0d03f507d4952bc2f2c746ee60dcd155ba4ea507 (patch) | |
| tree | a14221562bdd4b2bcd1281eae1ca9ab18e968f1d /src/kernel | |
| parent | 308c993928937070e462c027f7e6b183e7858a2a (diff) | |
| download | talos-hostboot-0d03f507d4952bc2f2c746ee60dcd155ba4ea507.tar.gz talos-hostboot-0d03f507d4952bc2f2c746ee60dcd155ba4ea507.zip | |
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 <dgilbert@us.ibm.com>
Reviewed-by: Melissa J. Connell <missyc@us.ibm.com>
Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Diffstat (limited to 'src/kernel')
| -rw-r--r-- | src/kernel/taskmgr.C | 40 |
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. |

