X-Git-Url: http://plrg.eecs.uci.edu/git/?p=c11tester.git;a=blobdiff_plain;f=actionlist.cc;h=f97e667a00c9a20273bbd7e146b4543d96776eda;hp=525694476c21308e8d2ae97462092b0c0b30c8cc;hb=251ac4b4bf3a9f2d3cfacc1e6618200ca1c431ac;hpb=f8dc5cedc1af12064f7512d0f843d2abcd004ed3 diff --git a/actionlist.cc b/actionlist.cc index 52569447..f97e667a 100644 --- a/actionlist.cc +++ b/actionlist.cc @@ -174,15 +174,16 @@ void actionlist::removeAction(ModelAction * act) { int shiftbits = MODELCLOCKBITS; modelclock_t clock = act->get_seq_number(); allnode * ptr = &root; + allnode * oldptr; modelclock_t currindex; while(shiftbits != 0) { shiftbits -= ALLBITS; currindex = (clock >> shiftbits) & ALLMASK; - allnode * tmp = ptr->children[currindex]; - if (tmp == NULL) + oldptr = ptr; + ptr = ptr->children[currindex]; + if (ptr == NULL) return; - ptr = tmp; } sllnode * llnode = reinterpret_cast *>(((uintptr_t) ptr) & ACTMASK); @@ -205,11 +206,11 @@ void actionlist::removeAction(ModelAction * act) { if (first) { //see if previous node has same clock as us... if (llnodeprev != NULL && llnodeprev->val->get_seq_number() == clock) { - ptr->children[currindex] = reinterpret_cast(((uintptr_t)llnodeprev) | ISACT); + oldptr->children[currindex] = reinterpret_cast(((uintptr_t)llnodeprev) | ISACT); } else { //remove ourselves and go up tree - ptr->children[currindex] = NULL; - decrementCount(ptr); + oldptr->children[currindex] = NULL; + decrementCount(oldptr); } } delete llnode; @@ -245,3 +246,16 @@ void actionlist::clear() { bool actionlist::isEmpty() { return root.count == 0; } + +/** + * Fix the parent pointer of root when root address changes (possible + * due to vector resize) + */ +void actionlist::fixupParent() +{ + for (int i = 0;i < ALLNODESIZE;i++) { + allnode * child = root.children[i]; + if (child != NULL && child->parent != &root) + child->parent = &root; + } +}