more bug fixes
[c11tester.git] / actionlist.cc
index f859746ccf5e5bac1c5148c420829946dee6fb0f..e76f5aedf8b899e9124d6c6ceeca798196ac726a 100644 (file)
@@ -5,8 +5,11 @@
 #include <limits.h>
 
 actionlist::actionlist() :
+       head(NULL),
+       tail(NULL),
        _size(0)
 {
+       root.parent = NULL;
 }
 
 actionlist::~actionlist() {
@@ -44,9 +47,10 @@ sllnode<ModelAction *> * allnode::findPrev(modelclock_t index) {
                                continue;
                        } else {
                                //found non-null...
-                               if (totalshift != 0)
-                                       ptr = ptr->children[currindex];
+                               if (totalshift == 0)
+                                       return reinterpret_cast<sllnode<ModelAction *> *>(((uintptr_t)ptr->children[currindex])& ACTMASK);
                                //need to increment here...
+                               ptr = ptr->children[currindex];
                                increment = increment >> ALLBITS;
                                mask = mask >> ALLBITS;
                                totalshift -= ALLBITS;
@@ -59,7 +63,7 @@ sllnode<ModelAction *> * allnode::findPrev(modelclock_t index) {
                mask = mask << ALLBITS;
                totalshift += ALLBITS;
 
-               if (increment == 0) {
+               if (ptr == NULL) {
                        return NULL;
                }
        }
@@ -71,9 +75,10 @@ sllnode<ModelAction *> * allnode::findPrev(modelclock_t index) {
                        if (ptr->children[currindex] != NULL) {
                                if (totalshift != 0) {
                                        ptr = ptr->children[currindex];
+                                       break;
                                } else {
                                        allnode * act = ptr->children[currindex];
-                                       sllnode<ModelAction *> * node = reinterpret_cast<sllnode<ModelAction *>*>(((uintptr_t)act) & ALLMASK);
+                                       sllnode<ModelAction *> * node = reinterpret_cast<sllnode<ModelAction *>*>(((uintptr_t)act) & ACTMASK);
                                        return node;
                                }
                        }
@@ -99,19 +104,16 @@ void actionlist::addAction(ModelAction * act) {
                        sllnode<ModelAction *> * llnode = new sllnode<ModelAction *>();
                        llnode->val = act;
                        if (tmp == NULL) {
-                               ptr->children[index] = reinterpret_cast<allnode *>(((uintptr_t) llnode) | ISACT);
-                               sllnode<ModelAction *> * llnodeprev = ptr->findPrev(index);
+                               sllnode<ModelAction *> * llnodeprev = ptr->findPrev(clock);
                                if (llnodeprev != NULL) {
-
                                        llnode->next = llnodeprev->next;
                                        llnode->prev = llnodeprev;
 
                                        //see if we are the new tail
-                                       if (llnodeprev->next == NULL)
-                                               tail = llnode;
-                                       else
+                                       if (llnode->next != NULL)
                                                llnode->next->prev = llnode;
-
+                                       else
+                                               tail = llnode;
                                        llnodeprev->next = llnode;
                                } else {
                                        //We are the begining
@@ -126,15 +128,20 @@ void actionlist::addAction(ModelAction * act) {
 
                                        head = llnode;
                                }
+                               ptr->children[index] = reinterpret_cast<allnode *>(((uintptr_t) llnode) | ISACT);
+
                                //need to find next link
                                ptr->count++;
                        } else {
                                //handle case where something else is here
 
-                               sllnode<ModelAction *> * llnodeprev = reinterpret_cast<sllnode<ModelAction *>*>(((uintptr_t) llnode) & ALLMASK);
+                               sllnode<ModelAction *> * llnodeprev = reinterpret_cast<sllnode<ModelAction *>*>(((uintptr_t) tmp) & ACTMASK);
                                llnode->next = llnodeprev->next;
                                llnode->prev = llnodeprev;
-                               llnode->next->prev = llnode;
+                               if (llnode->next != NULL)
+                                       llnode->next->prev = llnode;
+                               else
+                                       tail = llnode;
                                llnodeprev->next = llnode;
                                ptr->children[index] = reinterpret_cast<allnode *>(((uintptr_t) llnode) | ISACT);
                        }
@@ -161,8 +168,8 @@ void decrementCount(allnode * ptr) {
                                        decrementCount(ptr->parent);
                                }
                        }
+                       delete ptr;
                }
-               delete ptr;
        }
 }
 
@@ -178,7 +185,7 @@ void actionlist::removeAction(ModelAction * act) {
                                //not found
                                return;
                        } else {
-                               sllnode<ModelAction *> * llnode = reinterpret_cast<sllnode<ModelAction *> *>(((uintptr_t) tmp) & ALLMASK);
+                               sllnode<ModelAction *> * llnode = reinterpret_cast<sllnode<ModelAction *> *>(((uintptr_t) tmp) & ACTMASK);
                                bool first = true;
                                do {
                                        if (llnode->val == act) {
@@ -197,7 +204,7 @@ void actionlist::removeAction(ModelAction * act) {
                                                }
                                                if (first) {
                                                        //see if previous node has same clock as us...
-                                                       if (llnodeprev->val->get_seq_number() == clock) {
+                                                       if (llnodeprev != NULL && llnodeprev->val->get_seq_number() == clock) {
                                                                ptr->children[index] = reinterpret_cast<allnode *>(((uintptr_t)llnodeprev) | ISACT);
                                                        } else {
                                                                //remove ourselves and go up tree