X-Git-Url: http://plrg.eecs.uci.edu/git/?p=c11tester.git;a=blobdiff_plain;f=snapshot.cc;h=6725a7aed80ffefab54247fde99e87d848c60329;hp=5c1c1e25fd0599922da93a9100c9eb41f16385f7;hb=729acbffd2562f10dd1864b010c3623faa485513;hpb=febd10a6b4b1af40b690219ebfd8d0b1a42b183c diff --git a/snapshot.cc b/snapshot.cc index 5c1c1e25..6725a7ae 100644 --- a/snapshot.cc +++ b/snapshot.cc @@ -181,9 +181,9 @@ static void mprot_snapshot_init(unsigned int numbackingpages, snapshot_add_memory_region(pagealignedbase, numheappages); } - -static void mprot_startExecution(VoidFuncPtr entryPoint) { - entryPoint(); +static void mprot_startExecution(ucontext_t * context, VoidFuncPtr entryPoint) { + /* setup the shared-stack context */ + create_context(context, fork_snap->mStackBase, model_calloc(STACK_SIZE_DEFAULT, 1), STACK_SIZE_DEFAULT, entryPoint); } static void mprot_add_to_snapshot(void *addr, unsigned int numPages) @@ -323,6 +323,7 @@ static void create_context(ucontext_t *ctxt, void *stack, size_t stacksize, getcontext(ctxt); ctxt->uc_stack.ss_sp = stack; ctxt->uc_stack.ss_size = stacksize; + ctxt->uc_link = NULL; makecontext(ctxt, func, 0); } @@ -330,7 +331,7 @@ static void create_context(ucontext_t *ctxt, void *stack, size_t stacksize, * process */ static void fork_exit() { - /* Intentionally empty */ + _Exit(EXIT_SUCCESS); } static void createSharedMemory() @@ -371,33 +372,26 @@ static void fork_snapshot_init(unsigned int numbackingpages, if (!fork_snap) createSharedMemory(); - void *base_model_snapshot_space = malloc((numheappages + 1) * PAGESIZE); - void *pagealignedbase = PageAlignAddressUpward(base_model_snapshot_space); - model_snapshot_space = create_mspace_with_base(pagealignedbase, numheappages * PAGESIZE, 1); + model_snapshot_space = create_mspace(numheappages * PAGESIZE, 1); } -static void fork_startExecution(VoidFuncPtr entryPoint) { - /* setup an "exiting" context */ - char stack[128]; - create_context(&exit_ctxt, stack, sizeof(stack), fork_exit); - - /* setup the shared-stack context */ - create_context(&fork_snap->shared_ctxt, fork_snap->mStackBase, - STACK_SIZE_DEFAULT, entryPoint); - /* switch to a new entryPoint context, on a new stack */ - model_swapcontext(&private_ctxt, &fork_snap->shared_ctxt); +volatile int forklock = 0; +static void fork_loop() { /* switch back here when takesnapshot is called */ snapshotid = fork_snap->currSnapShotID; if (model->params.nofork) { setcontext(&fork_snap->shared_ctxt); - exit(EXIT_SUCCESS); + _Exit(EXIT_SUCCESS); } while (true) { pid_t forkedID; fork_snap->currSnapShotID = snapshotid + 1; + + forklock = 1; forkedID = fork(); + forklock = 0; if (0 == forkedID) { setcontext(&fork_snap->shared_ctxt); @@ -414,13 +408,23 @@ static void fork_startExecution(VoidFuncPtr entryPoint) { } if (fork_snap->mIDToRollback != snapshotid) - exit(EXIT_SUCCESS); + _Exit(EXIT_SUCCESS); } } } -static snapshot_id fork_take_snapshot() -{ +static void fork_startExecution(ucontext_t *context, VoidFuncPtr entryPoint) { + /* setup an "exiting" context */ + char stack[128]; + create_context(&exit_ctxt, stack, sizeof(stack), fork_exit); + + /* setup the system context */ + create_context(context, fork_snap->mStackBase, STACK_SIZE_DEFAULT, entryPoint); + /* switch to a new entryPoint context, on a new stack */ + create_context(&private_ctxt, snapshot_calloc(STACK_SIZE_DEFAULT, 1), STACK_SIZE_DEFAULT, fork_loop); +} + +static snapshot_id fork_take_snapshot() { model_swapcontext(&fork_snap->shared_ctxt, &private_ctxt); DEBUG("TAKESNAPSHOT RETURN\n"); return snapshotid; @@ -451,12 +455,12 @@ void snapshot_system_init(unsigned int numbackingpages, #endif } -void startExecution(VoidFuncPtr entryPoint) +void startExecution(ucontext_t *context, VoidFuncPtr entryPoint) { #if USE_MPROTECT_SNAPSHOT - mprot_startExecution(entryPoint); + mprot_startExecution(context, entryPoint); #else - fork_startExecution(entryPoint); + fork_startExecution(context, entryPoint); #endif }