X-Git-Url: http://plrg.eecs.uci.edu/git/?p=c11tester.git;a=blobdiff_plain;f=snapshot.cc;h=da478075c8b4f8bde0c4fdfb3bc499f44a79ace9;hp=6d6b45070b7c611699d9d14b0b620468ee173668;hb=103b2cae595a3744095dd8432b62b138f24ec9eb;hpb=bd67491a35b9a462e1775d154d3eecfe33711984 diff --git a/snapshot.cc b/snapshot.cc index 6d6b4507..da478075 100644 --- a/snapshot.cc +++ b/snapshot.cc @@ -6,14 +6,12 @@ #include #include #include -#include #include "hashtable.h" #include "snapshot.h" #include "mymemory.h" #include "common.h" - -#define FAILURE(mesg) { model_print("failed in the API: %s with errno relative message: %s\n", mesg, strerror(errno)); exit(EXIT_FAILURE); } +#include "context.h" /** PageAlignedAdressUpdate return a page aligned address for the * address being added as a side effect the numBytes are also changed. @@ -174,12 +172,12 @@ static void mprot_snapshot_init(unsigned int numbackingpages, void *basemySpace = model_malloc((numheappages + 1) * PAGESIZE); void *pagealignedbase = PageAlignAddressUpward(basemySpace); user_snapshot_space = create_mspace_with_base(pagealignedbase, numheappages * PAGESIZE, 1); - addMemoryRegionToSnapShot(pagealignedbase, numheappages); + snapshot_add_memory_region(pagealignedbase, numheappages); void *base_model_snapshot_space = model_malloc((numheappages + 1) * PAGESIZE); pagealignedbase = PageAlignAddressUpward(base_model_snapshot_space); model_snapshot_space = create_mspace_with_base(pagealignedbase, numheappages * PAGESIZE, 1); - addMemoryRegionToSnapShot(pagealignedbase, numheappages); + snapshot_add_memory_region(pagealignedbase, numheappages); entryPoint(); } @@ -247,8 +245,6 @@ static void mprot_roll_back(snapshot_id theID) #else /* !USE_MPROTECT_SNAPSHOT */ -#include - #define SHARED_MEMORY_DEFAULT (100 * ((size_t)1 << 20)) // 100mb for the shared memory #define STACK_SIZE_DEFAULT (((size_t)1 << 20) * 20) // 20 mb out of the above 100 mb for my stack @@ -282,8 +278,10 @@ static void createSharedMemory() { //step 1. create shared memory. void *memMapBase = mmap(0, SHARED_MEMORY_DEFAULT + STACK_SIZE_DEFAULT, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANON, -1, 0); - if (MAP_FAILED == memMapBase) - FAILURE("mmap"); + if (memMapBase == MAP_FAILED) { + perror("mmap"); + exit(EXIT_FAILURE); + } //Setup snapshot record at top of free region fork_snap = (struct fork_snapshotter *)memMapBase; @@ -325,7 +323,7 @@ static void fork_snapshot_init(unsigned int numbackingpages, newContext.uc_stack.ss_size = STACK_SIZE_DEFAULT; makecontext(&newContext, entryPoint, 0); /* switch to a new entryPoint context, on a new stack */ - swapcontext(&savedSnapshotContext, &newContext); + model_swapcontext(&savedSnapshotContext, &newContext); /* switch back here when takesnapshot is called */ pid_t forkedID = 0; @@ -349,19 +347,19 @@ static void fork_snapshot_init(unsigned int numbackingpages, setcontext(&savedUserSnapshotContext); } } else { - int status; - int retVal; - - DEBUG("The process id of child is %d and the process id of this process is %d and snapshot id is %d\n", - forkedID, getpid(), snapshotid); - - do { - retVal = waitpid(forkedID, &status, 0); - } while (-1 == retVal && errno == EINTR); + DEBUG("parent PID: %d, child PID: %d, snapshot ID: %d\n", + getpid(), forkedID, snapshotid); + + while (waitpid(forkedID, NULL, 0) < 0) { + /* waitpid() may be interrupted */ + if (errno != EINTR) { + perror("waitpid"); + exit(EXIT_FAILURE); + } + } - if (fork_snap->mIDToRollback != snapshotid) { + if (fork_snap->mIDToRollback != snapshotid) exit(EXIT_SUCCESS); - } rollback = true; } } @@ -369,7 +367,7 @@ static void fork_snapshot_init(unsigned int numbackingpages, static snapshot_id fork_take_snapshot() { - swapcontext(&savedUserSnapshotContext, &savedSnapshotContext); + model_swapcontext(&savedUserSnapshotContext, &savedSnapshotContext); DEBUG("TAKESNAPSHOT RETURN\n"); return snapshotid; } @@ -398,10 +396,11 @@ static void fork_roll_back(snapshot_id theID) #endif /* !USE_MPROTECT_SNAPSHOT */ -/** The initSnapshotLibrary function initializes the snapshot library. - * @param entryPoint the function that should run the program. +/** + * @brief Initializes the snapshot system + * @param entryPoint the function that should run the program. */ -void initSnapshotLibrary(unsigned int numbackingpages, +void snapshot_system_init(unsigned int numbackingpages, unsigned int numsnapshots, unsigned int nummemoryregions, unsigned int numheappages, VoidFuncPtr entryPoint) { @@ -412,8 +411,8 @@ void initSnapshotLibrary(unsigned int numbackingpages, #endif } -/** The addMemoryRegionToSnapShot function assumes that addr is page aligned. */ -void addMemoryRegionToSnapShot(void *addr, unsigned int numPages) +/** Assumes that addr is page aligned. */ +void snapshot_add_memory_region(void *addr, unsigned int numPages) { #if USE_MPROTECT_SNAPSHOT mprot_add_to_snapshot(addr, numPages); @@ -422,10 +421,10 @@ void addMemoryRegionToSnapShot(void *addr, unsigned int numPages) #endif } -/** The takeSnapshot function takes a snapshot. +/** Takes a snapshot of memory. * @return The snapshot identifier. */ -snapshot_id takeSnapshot() +snapshot_id take_snapshot() { #if USE_MPROTECT_SNAPSHOT return mprot_take_snapshot(); @@ -434,10 +433,10 @@ snapshot_id takeSnapshot() #endif } -/** The rollBack function rollback to the given snapshot identifier. +/** Rolls the memory state back to the given snapshot identifier. * @param theID is the snapshot identifier to rollback to. */ -void rollBack(snapshot_id theID) +void snapshot_roll_back(snapshot_id theID) { #if USE_MPROTECT_SNAPSHOT mprot_roll_back(theID);