diff options
author | neal <neal> | 2007-12-11 00:27:49 +0000 |
---|---|---|
committer | neal <neal> | 2007-12-11 00:27:49 +0000 |
commit | ab6522abab42a9789db9c78bf440b0482a034ecf (patch) | |
tree | 25029bf6f3f88ce4c4af83a9f083130ee2b433ca /viengoos/activity.c | |
parent | 6460869932bf5900aefa6793f2a4c8d0df33a686 (diff) |
2007-12-11 Neal H. Walfield <neal@gnu.org>
* activity.c (activity_destroy): Clear VICTIM->SIBLING_NEXT.TYPE
and VICTIM->SIBLING_PREV.TYPE. Add additional asserts.
Diffstat (limited to 'viengoos/activity.c')
-rw-r--r-- | viengoos/activity.c | 50 |
1 files changed, 23 insertions, 27 deletions
diff --git a/viengoos/activity.c b/viengoos/activity.c index 999f88a..ff9b54c 100644 --- a/viengoos/activity.c +++ b/viengoos/activity.c @@ -35,9 +35,7 @@ activity_create (struct activity *parent, if (old_parent) /* CHILD is live. Destroy it first. */ { - struct object_desc *desc = object_to_object_desc (old_parent); - assert (desc->type == cap_activity_control); - + assert (object_type (old_parent) == cap_activity_control); activity_destroy (parent, child); } @@ -47,29 +45,24 @@ activity_create (struct activity *parent, return; } - struct object_desc *child_desc; - child_desc = object_to_object_desc ((struct object *) child); - + /* Set child's parent pointer. */ child->parent = object_to_cap ((struct object *) parent); child->parent_ptr = parent; + /* Connect to PARENT's activity list. */ child->sibling_next = parent->children; child->sibling_prev.type = cap_void; parent->children = object_to_cap ((struct object *) child); - struct object *next = cap_to_object (parent, &child->sibling_next); - if (next) + struct object *old_head = cap_to_object (parent, &child->sibling_next); + if (old_head) { - struct object_desc *desc; - desc = object_to_object_desc (next); - assert (desc->type == cap_activity_control); - - struct activity *n = (struct activity *) next; + assert (object_type (old_head) == cap_activity_control); + /* The old head's previous pointer should be NULL. */ + assert (! cap_to_object (parent, + &((struct activity *) old_head)->sibling_prev)); - struct object *prev = cap_to_object (parent, &n->sibling_prev); - assert (! prev); - - ((struct activity *) n)->sibling_prev + ((struct activity *) old_head)->sibling_prev = object_to_cap ((struct object *) child); } } @@ -82,10 +75,12 @@ activity_destroy (struct activity *activity, struct activity *victim) /* We should never destroy the root activity. */ if (! victim->parent_ptr) - panic ("Request to destroy root activity"); + { + assert (victim == root_activity); + panic ("Request to destroy root activity"); + } - if (victim->dying) - panic ("Recursive destroy!"); + assert (! victim->dying); victim->dying = 1; /* XXX: Rewrite this to avoid recusion!!! */ @@ -160,6 +155,8 @@ activity_destroy (struct activity *activity, struct activity *victim) /* Remove from parent's activity list. */ struct activity *parent = victim->parent_ptr; + assert ((struct object *) parent + == cap_to_object (activity, &victim->parent)); struct object *prev_object = cap_to_object (activity, &victim->sibling_prev); assert (! prev_object @@ -174,19 +171,18 @@ activity_destroy (struct activity *activity, struct activity *victim) if (prev) prev->sibling_next = victim->sibling_next; else - /* VICTIM better be the head of PARENT's child list. */ + /* VICTIM is the head of PARENT's child list. */ { - struct object_desc *desc - = object_to_object_desc ((struct object *) victim); - - assert (parent->children.oid == desc->oid); - assert (parent->children.version == desc->version); - + assert (cap_to_object (activity, &parent->children) + == (struct object *) victim); parent->children = victim->sibling_next; } if (next) next->sibling_prev = victim->sibling_prev; + + victim->sibling_next.type = cap_void; + victim->sibling_prev.type = cap_void; } static void |