snapshot: fix EOL spaces
[model-checker.git] / snapshot.cc
index 83d22b4f5939b31ec7689177aed381b057966697..0362994daf50354d6a34991ab07294fed4fc19ce 100644 (file)
@@ -61,7 +61,7 @@ void initSnapShotRecord(unsigned int numbackingpages, unsigned int numsnapshots,
        snapshotrecord->regionsToSnapShot=( struct MemoryRegion * )MYMALLOC(sizeof(struct MemoryRegion)*nummemoryregions);
        snapshotrecord->backingStoreBasePtr= ( struct SnapShotPage * )MYMALLOC( sizeof( struct SnapShotPage ) * (numbackingpages + 1) );
        //Page align the backingstorepages
-       snapshotrecord->backingStore=( struct SnapShotPage * )ReturnPageAlignedAddress((void*) ((uintptr_t)(snapshotrecord->backingStoreBasePtr)+sizeof(struct SnapShotPage)-1));
+       snapshotrecord->backingStore=( struct SnapShotPage * )PageAlignAddressUpward(snapshotrecord->backingStoreBasePtr);
        snapshotrecord->backingRecords=( struct BackingPageRecord * )MYMALLOC(sizeof(struct BackingPageRecord)*numbackingpages);
        snapshotrecord->snapShots= ( struct SnapShotRecord * )MYMALLOC(sizeof(struct SnapShotRecord)*numsnapshots);
        snapshotrecord->lastSnapShot=0;
@@ -77,13 +77,13 @@ void HandlePF( int sig, siginfo_t *si, void * unused){
 #if USE_CHECKPOINTING
        if( si->si_code == SEGV_MAPERR ){
                printf("Real Fault at %llx\n", ( long long )si->si_addr);
-               exit( EXIT_FAILURE );   
+               exit( EXIT_FAILURE );
        }
        void* addr = ReturnPageAlignedAddress(si->si_addr);
        unsigned int backingpage=snapshotrecord->lastBackingPage++; //Could run out of pages...
        if (backingpage==snapshotrecord->maxBackingPages) {
                printf("Out of backing pages at %llx\n", ( long long )si->si_addr);
-               exit( EXIT_FAILURE );   
+               exit( EXIT_FAILURE );
        }
 
        //copy page
@@ -103,6 +103,12 @@ void HandlePF( int sig, siginfo_t *si, void * unused){
 void * ReturnPageAlignedAddress(void * addr) {
        return (void *)(((uintptr_t)addr)&~(PAGESIZE-1));
 }
+
+//Return a page aligned address for the address being added
+//as a side effect the numBytes are also changed.
+void * PageAlignAddressUpward(void * addr) {
+       return (void *)((((uintptr_t)addr)+PAGESIZE-1)&~(PAGESIZE-1));
+}
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -128,8 +134,15 @@ extern "C" {
 #endif
 void initSnapShotLibrary(unsigned int numbackingpages, unsigned int numsnapshots, unsigned int nummemoryregions, unsigned int numheappages, MyFuncPtr entryPoint){
 #if USE_CHECKPOINTING
+  /* Setup a stack for our signal handler....  */
+  stack_t ss;
+  ss.ss_sp = MYMALLOC(SIGSTACKSIZE);
+  ss.ss_size = SIGSTACKSIZE;
+  ss.ss_flags = 0;
+  sigaltstack(&ss, NULL);
+
        struct sigaction sa;
-       sa.sa_flags = SA_SIGINFO | SA_NODEFER | SA_RESTART;
+       sa.sa_flags = SA_SIGINFO | SA_NODEFER | SA_RESTART | SA_ONSTACK;
        sigemptyset( &sa.sa_mask );
        sa.sa_sigaction = HandlePF;
        if( sigaction( SIGSEGV, &sa, NULL ) == -1 ){
@@ -137,9 +150,9 @@ void initSnapShotLibrary(unsigned int numbackingpages, unsigned int numsnapshots
                exit(-1);
        }
        initSnapShotRecord(numbackingpages, numsnapshots, nummemoryregions);
-       
+
        basemySpace=MYMALLOC((numheappages+1)*PAGESIZE);
-       void * pagealignedbase=(void *)((((uintptr_t)basemySpace)+PAGESIZE-1)&~(PAGESIZE-1));
+       void * pagealignedbase=PageAlignAddressUpward(basemySpace);
        mySpace = create_mspace_with_base(pagealignedbase,  numheappages*PAGESIZE, 1 );
        addMemoryRegionToSnapShot(pagealignedbase, numheappages);
        entryPoint();
@@ -159,7 +172,7 @@ void initSnapShotLibrary(unsigned int numbackingpages, unsigned int numsnapshots
        gettimeofday( starttime, NULL );
 #endif
        //step 2 setup the stack context.
+
        int alreadySwapped = 0;
        getcontext( &savedSnapshotContext );
        if( !alreadySwapped ){
@@ -172,7 +185,7 @@ void initSnapShotLibrary(unsigned int numbackingpages, unsigned int numsnapshots
                makecontext( &newContext, entryPoint, 0 );
                swapcontext( &swappedContext, &newContext );
        }
-  
+
        //add the code to take a snapshot here...
        //to return to user process, do a second swapcontext...
        pid_t forkedID = 0;
@@ -181,7 +194,7 @@ void initSnapShotLibrary(unsigned int numbackingpages, unsigned int numsnapshots
        while( !sTheRecord->mbFinalize ){
                sTheRecord->currSnapShotID=snapshotid+1;
                forkedID = fork();
-               if( 0 == forkedID ){ 
+               if( 0 == forkedID ){
                        ucontext_t currentContext;
 #if 0
                        int dbg = 0;
@@ -190,7 +203,7 @@ void initSnapShotLibrary(unsigned int numbackingpages, unsigned int numsnapshots
                        if( swapContext )
                                swapcontext( &currentContext, &( sTheRecord->mContextToRollback ) );
                        else{
-                               swapcontext( &currentContext, &savedUserSnapshotContext );      
+                               swapcontext( &currentContext, &savedUserSnapshotContext );
                        }
                } else {
                        int status;
@@ -200,7 +213,7 @@ void initSnapShotLibrary(unsigned int numbackingpages, unsigned int numsnapshots
                        sprintf( mesg, "The process id of child is %d and the process id of this process is %d and snapshot id is %d", forkedID, getpid(), snapshotid );
                        DumpIntoLog( "ModelSnapshot", mesg );
 #endif
-                       do { 
+                       do {
                                retVal=waitpid( forkedID, &status, 0 );
                        } while( -1 == retVal && errno == EINTR );
 
@@ -211,7 +224,7 @@ void initSnapShotLibrary(unsigned int numbackingpages, unsigned int numsnapshots
                        }
                }
        }
-  
+
 #endif
 }
 /* This function assumes that addr is page aligned */
@@ -222,7 +235,7 @@ void addMemoryRegionToSnapShot( void * addr, unsigned int numPages) {
                printf("Exceeded supported number of memory regions!\n");
                exit(-1);
        }
-  
+
        snapshotrecord->regionsToSnapShot[ memoryregion ].basePtr=addr;
        snapshotrecord->regionsToSnapShot[ memoryregion ].sizeInPages=numPages;
 #endif //NOT REQUIRED IN THE CASE OF FORK BASED SNAPSHOTS.
@@ -235,7 +248,7 @@ snapshot_id takeSnapshot( ){
                        perror("mprotect");
                        printf("Failed to mprotect inside of takeSnapShot\n");
                        exit(-1);
-               }               
+               }
        }
        unsigned int snapshot=snapshotrecord->lastSnapShot++;
        if (snapshot==snapshotrecord->maxSnapShots) {
@@ -243,7 +256,7 @@ snapshot_id takeSnapshot( ){
                exit(-1);
        }
        snapshotrecord->snapShots[snapshot].firstBackingPage=snapshotrecord->lastBackingPage;
-  
+
        return snapshot;
 #else
        swapcontext( &savedUserSnapshotContext, &savedSnapshotContext );
@@ -258,15 +271,15 @@ void rollBack( snapshot_id theID ){
                        perror("mprotect");
                        printf("Failed to mprotect inside of takeSnapShot\n");
                        exit(-1);
-               }               
+               }
        }
        for(unsigned int page=snapshotrecord->snapShots[theID].firstBackingPage; page<snapshotrecord->lastBackingPage; page++) {
                bool oldVal = false;
                if( duplicateMap.find( snapshotrecord->backingRecords[page].basePtrOfPage ) != duplicateMap.end() ){
-                       oldVal = true;          
+                       oldVal = true;
                }
                else{
-                       duplicateMap[ snapshotrecord->backingRecords[page].basePtrOfPage ] = true;    
+                       duplicateMap[ snapshotrecord->backingRecords[page].basePtrOfPage ] = true;
                }
                if(  !oldVal ){
                        memcpy(snapshotrecord->backingRecords[page].basePtrOfPage, &snapshotrecord->backingStore[page], sizeof(struct SnapShotPage));
@@ -282,7 +295,7 @@ void rollBack( snapshot_id theID ){
        if( !sTemp ){
                sTemp = 1;
 #if SSDEBUG
-               DumpIntoLog( "ModelSnapshot", "Invoked rollback" ); 
+               DumpIntoLog( "ModelSnapshot", "Invoked rollback" );
 #endif
                exit( 0 );
        }