snapshotrecord->regionsToSnapShot=( struct MemoryRegion * )MYMALLOC(sizeof(struct MemoryRegion)*nummemoryregions);
snapshotrecord->backingStoreBasePtr= ( struct SnapShotPage * )MYMALLOC( sizeof( struct SnapShotPage ) * (numbackingpages + 1) );
//Page align the backingstorepages
snapshotrecord->regionsToSnapShot=( struct MemoryRegion * )MYMALLOC(sizeof(struct MemoryRegion)*nummemoryregions);
snapshotrecord->backingStoreBasePtr= ( struct SnapShotPage * )MYMALLOC( sizeof( struct SnapShotPage ) * (numbackingpages + 1) );
//Page align the backingstorepages
snapshotrecord->backingRecords=( struct BackingPageRecord * )MYMALLOC(sizeof(struct BackingPageRecord)*numbackingpages);
snapshotrecord->snapShots= ( struct SnapShotRecord * )MYMALLOC(sizeof(struct SnapShotRecord)*numsnapshots);
snapshotrecord->lastSnapShot=0;
snapshotrecord->backingRecords=( struct BackingPageRecord * )MYMALLOC(sizeof(struct BackingPageRecord)*numbackingpages);
snapshotrecord->snapShots= ( struct SnapShotRecord * )MYMALLOC(sizeof(struct SnapShotRecord)*numsnapshots);
snapshotrecord->lastSnapShot=0;
#if USE_CHECKPOINTING
if( si->si_code == SEGV_MAPERR ){
printf("Real Fault at %llx\n", ( long long )si->si_addr);
#if USE_CHECKPOINTING
if( si->si_code == SEGV_MAPERR ){
printf("Real Fault at %llx\n", ( long long )si->si_addr);
}
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);
}
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);
+
+//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));
+}
#endif
void initSnapShotLibrary(unsigned int numbackingpages, unsigned int numsnapshots, unsigned int nummemoryregions, unsigned int numheappages, MyFuncPtr entryPoint){
#if USE_CHECKPOINTING
#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);
+
sigemptyset( &sa.sa_mask );
sa.sa_sigaction = HandlePF;
if( sigaction( SIGSEGV, &sa, NULL ) == -1 ){
sigemptyset( &sa.sa_mask );
sa.sa_sigaction = HandlePF;
if( sigaction( SIGSEGV, &sa, NULL ) == -1 ){
mySpace = create_mspace_with_base(pagealignedbase, numheappages*PAGESIZE, 1 );
addMemoryRegionToSnapShot(pagealignedbase, numheappages);
entryPoint();
mySpace = create_mspace_with_base(pagealignedbase, numheappages*PAGESIZE, 1 );
addMemoryRegionToSnapShot(pagealignedbase, numheappages);
entryPoint();
gettimeofday( starttime, NULL );
#endif
//step 2 setup the stack context.
gettimeofday( starttime, NULL );
#endif
//step 2 setup the stack context.
makecontext( &newContext, entryPoint, 0 );
swapcontext( &swappedContext, &newContext );
}
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;
//add the code to take a snapshot here...
//to return to user process, do a second swapcontext...
pid_t forkedID = 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
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
retVal=waitpid( forkedID, &status, 0 );
} while( -1 == retVal && errno == EINTR );
retVal=waitpid( forkedID, &status, 0 );
} while( -1 == retVal && errno == EINTR );
snapshotrecord->regionsToSnapShot[ memoryregion ].basePtr=addr;
snapshotrecord->regionsToSnapShot[ memoryregion ].sizeInPages=numPages;
#endif //NOT REQUIRED IN THE CASE OF FORK BASED SNAPSHOTS.
snapshotrecord->regionsToSnapShot[ memoryregion ].basePtr=addr;
snapshotrecord->regionsToSnapShot[ memoryregion ].sizeInPages=numPages;
#endif //NOT REQUIRED IN THE CASE OF FORK BASED SNAPSHOTS.
}
for(unsigned int page=snapshotrecord->snapShots[theID].firstBackingPage; page<snapshotrecord->lastBackingPage; page++) {
bool oldVal = false;
if( duplicateMap.find( snapshotrecord->backingRecords[page].basePtrOfPage ) != duplicateMap.end() ){
}
for(unsigned int page=snapshotrecord->snapShots[theID].firstBackingPage; page<snapshotrecord->lastBackingPage; page++) {
bool oldVal = false;
if( duplicateMap.find( snapshotrecord->backingRecords[page].basePtrOfPage ) != duplicateMap.end() ){
}
if( !oldVal ){
memcpy(snapshotrecord->backingRecords[page].basePtrOfPage, &snapshotrecord->backingStore[page], sizeof(struct SnapShotPage));
}
if( !oldVal ){
memcpy(snapshotrecord->backingRecords[page].basePtrOfPage, &snapshotrecord->backingStore[page], sizeof(struct SnapShotPage));