X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=snapshot.cc;h=24e8d073ca1330eb778b897955e500dab30f9c5e;hb=0d3c4eca7d657d93c5a30681f22d9856847370f9;hp=dab1a480d5910d84ed97ec2782e6fa73d7e50a85;hpb=db26d1e3370a583f8eef79194c87ba9d2ef92530;p=c11tester.git diff --git a/snapshot.cc b/snapshot.cc index dab1a480..24e8d073 100644 --- a/snapshot.cc +++ b/snapshot.cc @@ -14,6 +14,9 @@ #include "context.h" #include "model.h" + +#if USE_MPROTECT_SNAPSHOT + /** PageAlignedAdressUpdate return a page aligned address for the * address being added as a side effect the numBytes are also changed. */ @@ -22,8 +25,6 @@ static void * PageAlignAddressUpward(void *addr) return (void *)((((uintptr_t)addr) + PAGESIZE - 1) & ~(PAGESIZE - 1)); } -#if USE_MPROTECT_SNAPSHOT - /* Each SnapShotRecord lists the firstbackingpage that must be written to * revert to that snapshot */ struct SnapShotRecord { @@ -277,20 +278,14 @@ struct fork_snapshotter { */ volatile snapshot_id mIDToRollback; - /** - * @brief The context for the shared (non-snapshot) stack - * - * This context is passed between the various processes which represent - * various snapshot states. It should be used primarily for the - * "client-side" code, not the main snapshot loop. - */ - ucontext_t shared_ctxt; + /** @brief Inter-process tracking of the next snapshot ID */ snapshot_id currSnapShotID; }; static struct fork_snapshotter *fork_snap = NULL; +ucontext_t shared_ctxt; /** @statics * These variables are necessary because the stack is shared region and @@ -381,7 +376,7 @@ static void fork_loop() { /* switch back here when takesnapshot is called */ snapshotid = fork_snap->currSnapShotID; if (model->params.nofork) { - setcontext(&fork_snap->shared_ctxt); + setcontext(&shared_ctxt); _Exit(EXIT_SUCCESS); } @@ -394,7 +389,7 @@ static void fork_loop() { modellock = 0; if (0 == forkedID) { - setcontext(&fork_snap->shared_ctxt); + setcontext(&shared_ctxt); } else { DEBUG("parent PID: %d, child PID: %d, snapshot ID: %d\n", getpid(), forkedID, snapshotid); @@ -415,8 +410,8 @@ static void fork_loop() { 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); + int exit_stack_size = 256; + create_context(&exit_ctxt, snapshot_calloc(exit_stack_size, 1), exit_stack_size, fork_exit); /* setup the system context */ create_context(context, fork_snap->mStackBase, STACK_SIZE_DEFAULT, entryPoint); @@ -425,7 +420,7 @@ static void fork_startExecution(ucontext_t *context, VoidFuncPtr entryPoint) { } static snapshot_id fork_take_snapshot() { - model_swapcontext(&fork_snap->shared_ctxt, &private_ctxt); + model_swapcontext(&shared_ctxt, &private_ctxt); DEBUG("TAKESNAPSHOT RETURN\n"); return snapshotid; } @@ -434,7 +429,7 @@ static void fork_roll_back(snapshot_id theID) { DEBUG("Rollback\n"); fork_snap->mIDToRollback = theID; - model_swapcontext(&fork_snap->shared_ctxt, &exit_ctxt); + model_swapcontext(model->get_system_context(), &exit_ctxt); fork_snap->mIDToRollback = -1; }