X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=snapshot.cc;h=e3ca558878d2a811bb1f639e6234e2c475023326;hb=18fb657b0c6f8abfe4048e5252a9ffab960acabc;hp=e8fdadba28839df18728b42ab7194c46ec01989c;hpb=2866fe7049df652f89f3bfc1cc85ad65b3a150f8;p=model-checker.git diff --git a/snapshot.cc b/snapshot.cc index e8fdadb..e3ca558 100644 --- a/snapshot.cc +++ b/snapshot.cc @@ -18,7 +18,7 @@ #include //extern declaration definition -#define FAILURE(mesg) { printf("failed in the API: %s with errno relative message: %s\n", mesg, strerror( errno ) ); exit( -1 ); } +#define FAILURE(mesg) { printf("failed in the API: %s with errno relative message: %s\n", mesg, strerror( errno ) ); exit(EXIT_FAILURE); } #if USE_MPROTECT_SNAPSHOT struct SnapShot * snapshotrecord = NULL; struct Snapshot_t * sTheRecord = NULL; @@ -115,6 +115,7 @@ extern "C" { sTheRecord->mStackSize = STACK_SIZE_DEFAULT; sTheRecord->mIDToRollback = -1; sTheRecord->currSnapShotID = 0; + sTheRecord->mbFinalize = false; #endif } #ifdef __cplusplus @@ -135,10 +136,17 @@ void initSnapShotLibrary(unsigned int numbackingpages, sa.sa_flags = SA_SIGINFO | SA_NODEFER | SA_RESTART | SA_ONSTACK; sigemptyset( &sa.sa_mask ); sa.sa_sigaction = HandlePF; +#ifdef MAC + if( sigaction( SIGBUS, &sa, NULL ) == -1 ){ + printf("SIGACTION CANNOT BE INSTALLED\n"); + exit(EXIT_FAILURE); + } +#endif if( sigaction( SIGSEGV, &sa, NULL ) == -1 ){ printf("SIGACTION CANNOT BE INSTALLED\n"); - exit(-1); + exit(EXIT_FAILURE); } + initSnapShotRecord(numbackingpages, numsnapshots, nummemoryregions); // EVIL HACK: We need to make sure that calls into the HandlePF method don't cause dynamic links @@ -156,15 +164,10 @@ void initSnapShotLibrary(unsigned int numbackingpages, addMemoryRegionToSnapShot(pagealignedbase, numheappages); entryPoint(); #else - //add a signal to indicate that the process is going to terminate. - struct sigaction sa; - sa.sa_flags = SA_SIGINFO | SA_NODEFER | SA_RESTART; - sigemptyset( &sa.sa_mask ); - sa.sa_sigaction = HandlePF; - if( sigaction( SIGUSR1, &sa, NULL ) == -1 ){ - printf("SIGACTION CANNOT BE INSTALLED\n"); - exit(-1); - } + + basemySpace=system_malloc((numheappages+1)*PAGESIZE); + void * pagealignedbase=PageAlignAddressUpward(basemySpace); + mySpace = create_mspace_with_base(pagealignedbase, numheappages*PAGESIZE, 1 ); createSharedLibrary(); //step 2 setup the stack context. @@ -214,7 +217,7 @@ void initSnapShotLibrary(unsigned int numbackingpages, } while( -1 == retVal && errno == EINTR ); if( sTheRecord->mIDToRollback != snapshotid ) - exit(0); + exit(EXIT_SUCCESS); else{ swapContext = true; } @@ -229,7 +232,7 @@ void addMemoryRegionToSnapShot( void * addr, unsigned int numPages) { unsigned int memoryregion=snapshotrecord->lastRegion++; if (memoryregion==snapshotrecord->maxRegions) { printf("Exceeded supported number of memory regions!\n"); - exit(-1); + exit(EXIT_FAILURE); } snapshotrecord->regionsToSnapShot[ memoryregion ].basePtr=addr; @@ -243,13 +246,13 @@ snapshot_id takeSnapshot( ){ if( mprotect(snapshotrecord->regionsToSnapShot[region].basePtr, snapshotrecord->regionsToSnapShot[region].sizeInPages*sizeof(struct SnapShotPage), PROT_READ ) == -1 ){ perror("mprotect"); printf("Failed to mprotect inside of takeSnapShot\n"); - exit(-1); + exit(EXIT_FAILURE); } } unsigned int snapshot=snapshotrecord->lastSnapShot++; if (snapshot==snapshotrecord->maxSnapShots) { printf("Out of snapshots\n"); - exit(-1); + exit(EXIT_FAILURE); } snapshotrecord->snapShots[snapshot].firstBackingPage=snapshotrecord->lastBackingPage; @@ -266,7 +269,7 @@ void rollBack( snapshot_id theID ){ if( mprotect(snapshotrecord->regionsToSnapShot[region].basePtr, snapshotrecord->regionsToSnapShot[region].sizeInPages*sizeof(struct SnapShotPage), PROT_READ | PROT_WRITE ) == -1 ){ perror("mprotect"); printf("Failed to mprotect inside of takeSnapShot\n"); - exit(-1); + exit(EXIT_FAILURE); } } for(unsigned int page=snapshotrecord->snapShots[theID].firstBackingPage; pagelastBackingPage; page++) { @@ -293,7 +296,7 @@ void rollBack( snapshot_id theID ){ #if SSDEBUG DumpIntoLog( "ModelSnapshot", "Invoked rollback" ); #endif - exit( 0 ); + exit(EXIT_SUCCESS); } #endif }