X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=snapshot.cc;h=0e47ac00f5cb22508bac587039d6d38246c54490;hb=288cd6dafe35fdb02c6802b75b968f1aeb3299c0;hp=5a25bb14efbe24bbf88ad0e4d6de8238316f884b;hpb=4698d40e0ba982029b4e1f018f2bdfc1b99a5b32;p=model-checker.git diff --git a/snapshot.cc b/snapshot.cc index 5a25bb1..0e47ac0 100644 --- a/snapshot.cc +++ b/snapshot.cc @@ -17,33 +17,32 @@ #include #include -//extern declaration definition #define FAILURE(mesg) { printf("failed in the API: %s with errno relative message: %s\n", mesg, strerror( errno ) ); exit(EXIT_FAILURE); } + +#ifdef CONFIG_SSDEBUG +#define SSDEBUG printf +#else +#define SSDEBUG(...) do { } while (0) +#endif + +/* extern declaration definition */ #if USE_MPROTECT_SNAPSHOT struct SnapShot * snapshotrecord = NULL; -struct Snapshot_t * sTheRecord = NULL; #else struct Snapshot_t * sTheRecord = 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+" ); - fprintf( myFile, "the message %s: the process id %d\n", message, thePID ); - fflush( myFile ); - fclose( myFile ); - myFile = NULL; -#endif -} + #if !USE_MPROTECT_SNAPSHOT static ucontext_t savedSnapshotContext; static ucontext_t savedUserSnapshotContext; static snapshot_id snapshotid = 0; #endif -/* Initialize snapshot data structure */ + #if USE_MPROTECT_SNAPSHOT + +/** The initSnapShotRecord method initialized the snapshotting data + * structures for the mprotect based 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); @@ -61,6 +60,10 @@ void initSnapShotRecord(unsigned int numbackingpages, unsigned int numsnapshots, } #endif //nothing to initialize for the fork based snapshotting. +/** HandlePF is the page fault handler for mprotect based snapshotting + * algorithm. + */ + void HandlePF( int sig, siginfo_t *si, void * unused){ #if USE_MPROTECT_SNAPSHOT if( si->si_code == SEGV_MAPERR ){ @@ -68,6 +71,7 @@ void HandlePF( int sig, siginfo_t *si, void * unused){ 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 %p\n", si->si_addr); @@ -86,41 +90,43 @@ void HandlePF( int sig, siginfo_t *si, void * unused){ #endif //nothing to handle for non snapshotting case. } -//Return a page aligned address for the address being added -//as a side effect the numBytes are also changed. +/** ReturnPageAlignedAddress returns a page aligned address for the + * address being added as a side effect the numBytes are also changed. + */ + 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. +/** PageAlignedAdressUpdate 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 - void createSharedLibrary(){ +void createSharedLibrary(){ #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. - if( -1 == fd ) FAILURE("shm_open"); - if( -1 == ftruncate( fd, ( size_t )SHARED_MEMORY_DEFAULT + ( size_t )STACK_SIZE_DEFAULT ) ) FAILURE( "ftruncate" ); - char * memMapBase = ( char * ) mmap( 0, ( size_t )SHARED_MEMORY_DEFAULT + ( size_t )STACK_SIZE_DEFAULT, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0 ); - if( MAP_FAILED == memMapBase ) FAILURE("mmap"); - sTheRecord = ( struct Snapshot_t * )memMapBase; - sTheRecord->mSharedMemoryBase = memMapBase + sizeof( struct Snapshot_t ); - sTheRecord->mStackBase = ( char * )memMapBase + ( size_t )SHARED_MEMORY_DEFAULT; - sTheRecord->mStackSize = STACK_SIZE_DEFAULT; - sTheRecord->mIDToRollback = -1; - sTheRecord->currSnapShotID = 0; - sTheRecord->mbFinalize = false; + //step 1. create shared memory. + if( sTheRecord ) return; + int fd = shm_open( "/ModelChecker-Snapshotter", O_RDWR | O_CREAT, 0777 ); //universal permissions. + if( -1 == fd ) FAILURE("shm_open"); + if( -1 == ftruncate( fd, ( size_t )SHARED_MEMORY_DEFAULT + ( size_t )STACK_SIZE_DEFAULT ) ) FAILURE( "ftruncate" ); + char * memMapBase = ( char * ) mmap( 0, ( size_t )SHARED_MEMORY_DEFAULT + ( size_t )STACK_SIZE_DEFAULT, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0 ); + if( MAP_FAILED == memMapBase ) FAILURE("mmap"); + sTheRecord = ( struct Snapshot_t * )memMapBase; + sTheRecord->mSharedMemoryBase = memMapBase + sizeof( struct Snapshot_t ); + sTheRecord->mStackBase = ( char * )memMapBase + ( size_t )SHARED_MEMORY_DEFAULT; + sTheRecord->mStackSize = STACK_SIZE_DEFAULT; + sTheRecord->mIDToRollback = -1; + sTheRecord->currSnapShotID = 0; + sTheRecord->mbFinalize = false; #endif - } -#ifdef __cplusplus } -#endif + +/** The initSnapShotLibrary function initializes the Snapshot library. + * @param entryPoint the function that should run the program. + */ void initSnapShotLibrary(unsigned int numbackingpages, unsigned int numsnapshots, unsigned int nummemoryregions, unsigned int numheappages, VoidFuncPtr entryPoint) { @@ -136,10 +142,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(EXIT_FAILURE); } + initSnapShotRecord(numbackingpages, numsnapshots, nummemoryregions); // EVIL HACK: We need to make sure that calls into the HandlePF method don't cause dynamic links @@ -147,6 +160,7 @@ void initSnapShotLibrary(unsigned int numbackingpages, // Solution is to call our signal handler before we start protecting stuff... siginfo_t si; + memset(&si, 0, sizeof(si)); si.si_addr=ss.ss_sp; HandlePF(SIGSEGV, &si, NULL); snapshotrecord->lastBackingPage--; //remove the fake page we copied @@ -200,11 +214,10 @@ void initSnapShotLibrary(unsigned int numbackingpages, } else { int status; int retVal; -#if SSDEBUG - char mesg[ 1024 ] = { 0 }; - 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 + + SSDEBUG("The process id of child is %d and the process id of this process is %d and snapshot id is %d", + forkedID, getpid(), snapshotid ); + do { retVal=waitpid( forkedID, &status, 0 ); } while( -1 == retVal && errno == EINTR ); @@ -219,7 +232,9 @@ void initSnapShotLibrary(unsigned int numbackingpages, #endif } -/* This function assumes that addr is page aligned */ + +/** The addMemoryRegionToSnapShot function assumes that addr is page aligned. + */ void addMemoryRegionToSnapShot( void * addr, unsigned int numPages) { #if USE_MPROTECT_SNAPSHOT unsigned int memoryregion=snapshotrecord->lastRegion++; @@ -232,7 +247,11 @@ void addMemoryRegionToSnapShot( void * addr, unsigned int numPages) { snapshotrecord->regionsToSnapShot[ memoryregion ].sizeInPages=numPages; #endif //NOT REQUIRED IN THE CASE OF FORK BASED SNAPSHOTS. } -//take snapshot + +/** The takeSnapshot function takes a snapshot. + * @return The snapshot identifier. + */ + snapshot_id takeSnapshot( ){ #if USE_MPROTECT_SNAPSHOT for(unsigned int region=0; regionlastRegion;region++) { @@ -255,6 +274,11 @@ snapshot_id takeSnapshot( ){ return snapshotid; #endif } + +/** The rollBack function rollback to the given snapshot identifier. + * @param theID is the snapshot identifier to rollback to. + */ + void rollBack( snapshot_id theID ){ #if USE_MPROTECT_SNAPSHOT std::map< void *, bool, std::less< void * >, MyAlloc< std::pair< const void *, bool > > > duplicateMap; @@ -286,14 +310,16 @@ void rollBack( snapshot_id theID ){ getcontext( &sTheRecord->mContextToRollback ); if( !sTemp ){ sTemp = 1; -#if SSDEBUG - DumpIntoLog( "ModelSnapshot", "Invoked rollback" ); -#endif + SSDEBUG("Invoked rollback"); exit(EXIT_SUCCESS); } #endif } +/** The finalize method shuts down the snapshotting system. */ +//Subramanian -- remove this function from the external interface and +//have us call it internally + void finalize(){ #if !USE_MPROTECT_SNAPSHOT sTheRecord->mbFinalize = true;