snapshot-interface: change hand-coded stack to vector
authorBrian Norris <banorris@uci.edu>
Thu, 3 Jan 2013 19:59:13 +0000 (11:59 -0800)
committerBrian Norris <banorris@uci.edu>
Thu, 3 Jan 2013 19:59:13 +0000 (11:59 -0800)
The logic, etc., is much simpler when using C++ vectors and constructors
here.

snapshot-interface.cc

index c33b8d44549aa29de3d1dbdbb71bbf5f7628d8fd..06dae19732e46d00b34865a4c8e9d9a9859f8704 100644 (file)
@@ -2,6 +2,7 @@
 #include <unistd.h>
 #include <cstring>
 #include <inttypes.h>
+#include <vector>
 
 #include "snapshot-interface.h"
 #include "snapshot.h"
 #define MAPFILE "/proc/self/maps"
 
 struct stackEntry {
-       struct stackEntry *next;
+       stackEntry(snapshot_id id, int idx) : snapshotid(id), index(idx) { }
        snapshot_id snapshotid;
        int index;
+       MEMALLOC
 };
 
 class SnapshotStack {
@@ -29,7 +31,7 @@ class SnapshotStack {
 
        MEMALLOC
  private:
-       struct stackEntry *stack;
+       std::vector<struct stackEntry, ModelAlloc<struct stackEntry> > stack;
 };
 
 static SnapshotStack *snapshotObject;
@@ -125,10 +127,9 @@ static void SnapshotGlobalSegments()
 }
 #endif
 
-SnapshotStack::SnapshotStack()
+SnapshotStack::SnapshotStack() : stack()
 {
        SnapshotGlobalSegments();
-       stack = NULL;
 }
 
 SnapshotStack::~SnapshotStack()
@@ -143,29 +144,24 @@ SnapshotStack::~SnapshotStack()
  */
 int SnapshotStack::backTrackBeforeStep(int seqindex)
 {
-       while (true) {
-               if (stack->index <= seqindex) {
-                       //have right entry
-                       snapshot_roll_back(stack->snapshotid);
-                       return stack->index;
-               }
-               struct stackEntry *tmp = stack;
-               stack = stack->next;
-               model_free(tmp);
-       }
+       int i;
+       for (i = (int)stack.size() - 1; i >= 0; i++)
+               if (stack[i].index <= seqindex)
+                       break;
+               else
+                       stack.pop_back();
+
+       ASSERT(i >= 0);
+       snapshot_roll_back(stack[i].snapshotid);
+       return stack[i].index;
 }
 
 /** This method takes a snapshot at the given sequence number. */
 void SnapshotStack::snapshotStep(int seqindex)
 {
-       struct stackEntry *tmp = (struct stackEntry *)model_malloc(sizeof(struct stackEntry));
-       tmp->next = stack;
-       tmp->index = seqindex;
-       tmp->snapshotid = take_snapshot();
-       stack = tmp;
+       stack.push_back(stackEntry(seqindex, take_snapshot()));
 }
 
-
 void snapshot_stack_init()
 {
        snapshotObject = new SnapshotStack();