switch back to norris style spacing in changed files
[model-checker.git] / snapshot-interface.cc
index e350bc473c35fb48aff42ac4a42e912d4867ffb1..b3da9cf95b8c4dc929c5a7c3173696d18014d001 100644 (file)
@@ -1,3 +1,5 @@
+/* -*- Mode: C; indent-tabs-mode: t -*- */
+
 #define MYBINARYNAME "model"
 #define MYLIBRARYNAME "libmodel.so"
 #define MYALLOCNAME  "libmymemory.so"
 #include <unistd.h>
 #include <sys/types.h>
 #include <sstream>
+#include <cstring>
+#include <cassert>
+
+snapshotStack * snapshotObject;
+
+/*This looks like it might leak memory...  Subramanian should fix this. */
+
 typedef std::basic_stringstream< char, std::char_traits< char >, MyAlloc< char > > MyStringStream;
 std::vector< MyString, MyAlloc< MyString> > splitString( MyString input, char delim ){
        std::vector< MyString, MyAlloc< MyString > > splits;
@@ -24,8 +33,20 @@ std::vector< MyString, MyAlloc< MyString> > splitString( MyString input, char de
 bool checkPermissions( MyString permStr ){
        return permStr.find("w") != MyString::npos;
 }
-std::vector< std::pair< void *, size_t >, MyAlloc< std::pair< void *, size_t > > > snapshot_utils::ReturnGlobalSegmentsToSnapshot(){
-       std::vector< std::pair< void *, size_t >, MyAlloc< std::pair< void *, size_t > > >  theVec;
+static void takeSegmentSnapshot( const MyString & lineText ){
+       std::vector< MyString, MyAlloc< MyString > > firstSplit = splitString( lineText, ' ' );
+       if( checkPermissions( firstSplit[ 1 ] ) ){
+               std::vector< MyString, MyAlloc< MyString > > secondSplit = splitString( firstSplit[ 0 ], '-' );    
+               size_t val1 = 0, val2 = 0;
+               sscanf( secondSplit[ 0 ].c_str(), "%zx", &val1 );
+               sscanf( secondSplit[ 1 ].c_str(), "%zx", &val2 );
+               size_t len = ( val2 - val1 ) / PAGESIZE;    
+               if( 0 != len ){
+                       addMemoryRegionToSnapShot( ( void * )val1, len );        
+               }
+       }
+}
+void SnapshotGlobalSegments(){
        MyString fn = PROCNAME;
        static char sProcessSize[ 12 ] = { 0 };
        std::pair< const char *, bool > dataSect[ 3 ];
@@ -49,17 +70,40 @@ std::vector< std::pair< void *, size_t >, MyAlloc< std::pair< void *, size_t > >
                        }
                        if( i >= 3 || dataSect[ i ].second == true ) continue;
                        dataSect[ i ].second = true;
-                       if( !procName.good() )return theVec;
+                       if( !procName.good() )return;
                        getline( procName, line );
-                       std::vector< MyString, MyAlloc< MyString > > firstSplit = splitString( line, ' ' );
-                       if( !checkPermissions( firstSplit[ 1 ]  ) ) continue;
-                       std::vector< MyString, MyAlloc< MyString > > secondSplit = splitString( firstSplit[ 0 ], '-' );
-                       size_t val1 = 0, val2 = 0;
-                       sscanf( secondSplit[ 0 ].c_str(), "%zx", &val1 );
-                       sscanf( secondSplit[ 1 ].c_str(), "%zx", &val2 );
-                       size_t len = ( val2 - val1 ) / PAGESIZE;
-                       theVec.push_back( std::make_pair( ( void * ) val1, len ) );
+                       takeSegmentSnapshot( line );    
                }       
        }
-       return theVec;
+}
+
+//class definition of snapshotStack.....
+//declaration of constructor....
+snapshotStack::snapshotStack(){
+       SnapshotGlobalSegments();
+       stack=NULL;
+}
+       
+snapshotStack::~snapshotStack(){
+}
+       
+int snapshotStack::backTrackBeforeStep(int seqindex) {
+       while(true) {
+               if (stack->index<=seqindex) {
+                       //have right entry
+                       rollBack(stack->snapshotid);
+                       return stack->index;
+               }
+               struct stackEntry *tmp=stack;
+               free(tmp);
+               stack=stack->next;
+       }
+}
+
+void snapshotStack::snapshotStep(int seqindex) {
+       struct stackEntry *tmp=(struct stackEntry *)malloc(sizeof(struct stackEntry));
+       tmp->next=stack;
+       tmp->index=seqindex;
+       tmp->snapshotid=takeSnapshot();
+       stack=tmp;
 }