X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=snapshot.cc;h=f129f4cc31da565aeed8bfd0b2a5d1f4b063e8a5;hb=4955df9bfa3d2e961024d419069735fd6f25ac67;hp=2c7d84193e1feb21443696335603b951491be9af;hpb=7f9bbee401eb5c04bd0a050c0daf19813e81a783;p=model-checker.git diff --git a/snapshot.cc b/snapshot.cc index 2c7d841..f129f4c 100644 --- a/snapshot.cc +++ b/snapshot.cc @@ -129,17 +129,17 @@ void createSharedMemory(){ #endif -/** The initSnapShotLibrary function initializes the Snapshot library. +/** The initSnapshotLibrary function initializes the snapshot library. * @param entryPoint the function that should run the program. */ #if USE_MPROTECT_SNAPSHOT -void initSnapShotLibrary(unsigned int numbackingpages, +void initSnapshotLibrary(unsigned int numbackingpages, unsigned int numsnapshots, unsigned int nummemoryregions, unsigned int numheappages, VoidFuncPtr entryPoint) { /* Setup a stack for our signal handler.... */ stack_t ss; - ss.ss_sp = model_malloc(SIGSTACKSIZE); + ss.ss_sp = PageAlignAddressUpward(model_malloc(SIGSTACKSIZE+PAGESIZE-1)); ss.ss_size = SIGSTACKSIZE; ss.ss_flags = 0; sigaltstack(&ss, NULL); @@ -178,7 +178,7 @@ void initSnapShotLibrary(unsigned int numbackingpages, entryPoint(); } #else -void initSnapShotLibrary(unsigned int numbackingpages, +void initSnapshotLibrary(unsigned int numbackingpages, unsigned int numsnapshots, unsigned int nummemoryregions, unsigned int numheappages, VoidFuncPtr entryPoint) { basemySpace=system_malloc((numheappages+1)*PAGESIZE); @@ -283,8 +283,17 @@ snapshot_id takeSnapshot( ){ * @param theID is the snapshot identifier to rollback to. */ void rollBack( snapshot_id theID ){ +#if USE_MPROTECT_SNAPSHOT==2 + if (snapshotrecord->lastSnapShot==(theID+1)) { + for(unsigned int page=snapshotrecord->snapShots[theID].firstBackingPage; pagelastBackingPage; page++) { + memcpy(snapshotrecord->backingRecords[page].basePtrOfPage, &snapshotrecord->backingStore[page], sizeof(struct SnapShotPage)); + } + return; + } +#endif + #if USE_MPROTECT_SNAPSHOT - HashTable< void *, bool, uintptr_t, 4, model_malloc, model_calloc, MYFREE> duplicateMap; + HashTable< void *, bool, uintptr_t, 4, model_malloc, model_calloc, model_free> duplicateMap; for(unsigned int region=0; regionlastRegion;region++) { if( mprotect(snapshotrecord->regionsToSnapShot[region].basePtr, snapshotrecord->regionsToSnapShot[region].sizeInPages*sizeof(struct SnapShotPage), PROT_READ | PROT_WRITE ) == -1 ){ perror("mprotect");