snapshot: clean up fork-based error handling
[c11tester.git] / snapshot.cc
index 16b0b616e3ebca00a453d8d0903ddcb2e2838711..da478075c8b4f8bde0c4fdfb3bc499f44a79ace9 100644 (file)
@@ -6,14 +6,12 @@
 #include <string.h>
 #include <errno.h>
 #include <sys/wait.h>
-#include <ucontext.h>
 
 #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.
@@ -247,8 +245,6 @@ static void mprot_roll_back(snapshot_id theID)
 
 #else /* !USE_MPROTECT_SNAPSHOT */
 
-#include <ucontext.h>
-
 #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)
 {