X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=snapshot.cc;h=e8fdadba28839df18728b42ab7194c46ec01989c;hb=2866fe7049df652f89f3bfc1cc85ad65b3a150f8;hp=0362994daf50354d6a34991ab07294fed4fc19ce;hpb=34e232a12096c3fce512ec06d921329edf8fcb3a;p=cdsspec-compiler.git diff --git a/snapshot.cc b/snapshot.cc index 0362994..e8fdadb 100644 --- a/snapshot.cc +++ b/snapshot.cc @@ -4,7 +4,6 @@ #include #include #include -#include #include #include #include "snapshot.h" @@ -17,45 +16,34 @@ #include #include #include -#include + //extern declaration definition #define FAILURE(mesg) { printf("failed in the API: %s with errno relative message: %s\n", mesg, strerror( errno ) ); exit( -1 ); } -#if USE_CHECKPOINTING +#if USE_MPROTECT_SNAPSHOT struct SnapShot * snapshotrecord = NULL; struct Snapshot_t * sTheRecord = NULL; #else struct Snapshot_t * sTheRecord = NULL; #endif -void BeginOperation( struct timeval * theStartTime ){ -#if 1 - gettimeofday( theStartTime, NULL ); -#endif -} -#if SSDEBUG -struct timeval *starttime = NULL; -#endif void DumpIntoLog( const char * filename, const char * message ){ #if SSDEBUG static pid_t thePID = getpid(); char newFn[ 1024 ] ={ 0 }; sprintf( newFn,"%s-%d.txt", filename, thePID ); FILE * myFile = fopen( newFn, "w+" ); - struct timeval theEndTime; - BeginOperation( &theEndTime ); - double elapsed = ( theEndTime.tv_sec - starttime->tv_sec ) + ( theEndTime.tv_usec - starttime->tv_usec ) / 1000000.0; - fprintf( myFile, "The timestamp %f:--> the message %s: the process id %d\n", elapsed, message, thePID ); + fprintf( myFile, "the message %s: the process id %d\n", message, thePID ); fflush( myFile ); fclose( myFile ); myFile = NULL; #endif } -#if !USE_CHECKPOINTING +#if !USE_MPROTECT_SNAPSHOT static ucontext_t savedSnapshotContext; static ucontext_t savedUserSnapshotContext; -static int snapshotid = 0; +static snapshot_id snapshotid = 0; #endif /* Initialize snapshot data structure */ -#if USE_CHECKPOINTING +#if USE_MPROTECT_SNAPSHOT void initSnapShotRecord(unsigned int numbackingpages, unsigned int numsnapshots, unsigned int nummemoryregions) { snapshotrecord=( struct SnapShot * )MYMALLOC(sizeof(struct SnapShot)); snapshotrecord->regionsToSnapShot=( struct MemoryRegion * )MYMALLOC(sizeof(struct MemoryRegion)*nummemoryregions); @@ -74,15 +62,15 @@ void initSnapShotRecord(unsigned int numbackingpages, unsigned int numsnapshots, #endif //nothing to initialize for the fork based snapshotting. void HandlePF( int sig, siginfo_t *si, void * unused){ -#if USE_CHECKPOINTING +#if USE_MPROTECT_SNAPSHOT if( si->si_code == SEGV_MAPERR ){ - printf("Real Fault at %llx\n", ( long long )si->si_addr); + printf("Real Fault at %p\n", si->si_addr); 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); + printf("Out of backing pages at %p\n", si->si_addr); exit( EXIT_FAILURE ); } @@ -113,7 +101,7 @@ void * PageAlignAddressUpward(void * addr) { extern "C" { #endif void createSharedLibrary(){ -#if !USE_CHECKPOINTING +#if !USE_MPROTECT_SNAPSHOT //step 1. create shared memory. if( sTheRecord ) return; int fd = shm_open( "/ModelChecker-Snapshotter", O_RDWR | O_CREAT, 0777 ); //universal permissions. @@ -132,14 +120,16 @@ extern "C" { #ifdef __cplusplus } #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); +void initSnapShotLibrary(unsigned int numbackingpages, + unsigned int numsnapshots, unsigned int nummemoryregions, + unsigned int numheappages, VoidFuncPtr entryPoint) { +#if USE_MPROTECT_SNAPSHOT + /* 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_ONSTACK; @@ -151,6 +141,15 @@ void initSnapShotLibrary(unsigned int numbackingpages, unsigned int numsnapshots } initSnapShotRecord(numbackingpages, numsnapshots, nummemoryregions); + // EVIL HACK: We need to make sure that calls into the HandlePF method don't cause dynamic links + // The problem is that we end up protecting state in the dynamic linker... + // Solution is to call our signal handler before we start protecting stuff... + + siginfo_t si; + si.si_addr=ss.ss_sp; + HandlePF(SIGSEGV, &si, NULL); + snapshotrecord->lastBackingPage--; //remove the fake page we copied + basemySpace=MYMALLOC((numheappages+1)*PAGESIZE); void * pagealignedbase=PageAlignAddressUpward(basemySpace); mySpace = create_mspace_with_base(pagealignedbase, numheappages*PAGESIZE, 1 ); @@ -167,10 +166,7 @@ void initSnapShotLibrary(unsigned int numbackingpages, unsigned int numsnapshots exit(-1); } createSharedLibrary(); -#if SSDEBUG - starttime = &(sTheRecord->startTimeGlobal); - gettimeofday( starttime, NULL ); -#endif + //step 2 setup the stack context. int alreadySwapped = 0; @@ -229,7 +225,7 @@ void initSnapShotLibrary(unsigned int numbackingpages, unsigned int numsnapshots } /* This function assumes that addr is page aligned */ void addMemoryRegionToSnapShot( void * addr, unsigned int numPages) { -#if USE_CHECKPOINTING +#if USE_MPROTECT_SNAPSHOT unsigned int memoryregion=snapshotrecord->lastRegion++; if (memoryregion==snapshotrecord->maxRegions) { printf("Exceeded supported number of memory regions!\n"); @@ -242,7 +238,7 @@ void addMemoryRegionToSnapShot( void * addr, unsigned int numPages) { } //take snapshot snapshot_id takeSnapshot( ){ -#if USE_CHECKPOINTING +#if USE_MPROTECT_SNAPSHOT for(unsigned int region=0; regionlastRegion;region++) { if( mprotect(snapshotrecord->regionsToSnapShot[region].basePtr, snapshotrecord->regionsToSnapShot[region].sizeInPages*sizeof(struct SnapShotPage), PROT_READ ) == -1 ){ perror("mprotect"); @@ -264,7 +260,7 @@ snapshot_id takeSnapshot( ){ #endif } void rollBack( snapshot_id theID ){ -#if USE_CHECKPOINTING +#if USE_MPROTECT_SNAPSHOT std::map< void *, bool, std::less< void * >, MyAlloc< std::pair< const void *, bool > > > 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 ){ @@ -303,7 +299,7 @@ void rollBack( snapshot_id theID ){ } void finalize(){ -#if !USE_CHECKPOINTING +#if !USE_MPROTECT_SNAPSHOT sTheRecord->mbFinalize = true; #endif }