snapshot: add (unused) mprot_snapshotter destructor
[model-checker.git] / snapshot.cc
index fe5110a03fe5a7b0e45e3b62471788eb396a9aed..6d6b45070b7c611699d9d14b0b620468ee173668 100644 (file)
@@ -46,8 +46,19 @@ struct MemoryRegion {
        int sizeInPages; // size of memory region in pages
 };
 
+/** ReturnPageAlignedAddress returns a page aligned address for the
+ * address being added as a side effect the numBytes are also changed.
+ */
+static void * ReturnPageAlignedAddress(void *addr)
+{
+       return (void *)(((uintptr_t)addr) & ~(PAGESIZE - 1));
+}
+
 /* Primary struct for snapshotting system */
 struct mprot_snapshotter {
+       mprot_snapshotter(unsigned int numbackingpages, unsigned int numsnapshots, unsigned int nummemoryregions);
+       ~mprot_snapshotter();
+
        struct MemoryRegion *regionsToSnapShot; //This pointer references an array of memory regions to snapshot
        snapshot_page_t *backingStore; //This pointer references an array of snapshotpage's that form the backing store
        void *backingStoreBasePtr; //This pointer references an array of snapshotpage's that form the backing store
@@ -61,42 +72,40 @@ struct mprot_snapshotter {
        unsigned int maxRegions; //Stores the max number of memory regions we support
        unsigned int maxBackingPages; //Stores the total number of backing pages
        unsigned int maxSnapShots; //Stores the total number of snapshots we allow
+
+       MEMALLOC
 };
 
 static struct mprot_snapshotter *mprot_snap = NULL;
 
-/** ReturnPageAlignedAddress returns a page aligned address for the
- * address being added as a side effect the numBytes are also changed.
- */
-static void * ReturnPageAlignedAddress(void *addr)
+mprot_snapshotter::mprot_snapshotter(unsigned int backing_pages, unsigned int snapshots, unsigned int regions) :
+       lastSnapShot(0),
+       lastBackingPage(0),
+       lastRegion(0),
+       maxRegions(regions),
+       maxBackingPages(backing_pages),
+       maxSnapShots(snapshots)
 {
-       return (void *)(((uintptr_t)addr) & ~(PAGESIZE - 1));
+       regionsToSnapShot = (struct MemoryRegion *)model_malloc(sizeof(struct MemoryRegion) * regions);
+       backingStoreBasePtr = (void *)model_malloc(sizeof(snapshot_page_t) * (backing_pages + 1));
+       //Page align the backingstorepages
+       backingStore = (snapshot_page_t *)PageAlignAddressUpward(backingStoreBasePtr);
+       backingRecords = (struct BackingPageRecord *)model_malloc(sizeof(struct BackingPageRecord) * backing_pages);
+       snapShots = (struct SnapShotRecord *)model_malloc(sizeof(struct SnapShotRecord) * snapshots);
 }
 
-/** The initSnapShotRecord method initialized the snapshotting data
- *  structures for the mprotect based snapshot.
- */
-static void initSnapShotRecord(unsigned int numbackingpages, unsigned int numsnapshots, unsigned int nummemoryregions)
+mprot_snapshotter::~mprot_snapshotter()
 {
-       mprot_snap = (struct mprot_snapshotter *)model_malloc(sizeof(struct mprot_snapshotter));
-       mprot_snap->regionsToSnapShot = (struct MemoryRegion *)model_malloc(sizeof(struct MemoryRegion) * nummemoryregions);
-       mprot_snap->backingStoreBasePtr = (void *)model_malloc(sizeof(snapshot_page_t) * (numbackingpages + 1));
-       //Page align the backingstorepages
-       mprot_snap->backingStore = (snapshot_page_t *)PageAlignAddressUpward(mprot_snap->backingStoreBasePtr);
-       mprot_snap->backingRecords = (struct BackingPageRecord *)model_malloc(sizeof(struct BackingPageRecord) * numbackingpages);
-       mprot_snap->snapShots = (struct SnapShotRecord *)model_malloc(sizeof(struct SnapShotRecord) * numsnapshots);
-       mprot_snap->lastSnapShot = 0;
-       mprot_snap->lastBackingPage = 0;
-       mprot_snap->lastRegion = 0;
-       mprot_snap->maxRegions = nummemoryregions;
-       mprot_snap->maxBackingPages = numbackingpages;
-       mprot_snap->maxSnapShots = numsnapshots;
+       model_free(regionsToSnapShot);
+       model_free(backingStoreBasePtr);
+       model_free(backingRecords);
+       model_free(snapShots);
 }
 
-/** HandlePF is the page fault handler for mprotect based snapshotting
+/** mprot_handle_pf is the page fault handler for mprotect based snapshotting
  * algorithm.
  */
-static void HandlePF(int sig, siginfo_t *si, void *unused)
+static void mprot_handle_pf(int sig, siginfo_t *si, void *unused)
 {
        if (si->si_code == SEGV_MAPERR) {
                model_print("Real Fault at %p\n", si->si_addr);
@@ -138,7 +147,7 @@ static void mprot_snapshot_init(unsigned int numbackingpages,
        struct sigaction sa;
        sa.sa_flags = SA_SIGINFO | SA_NODEFER | SA_RESTART | SA_ONSTACK;
        sigemptyset(&sa.sa_mask);
-       sa.sa_sigaction = HandlePF;
+       sa.sa_sigaction = mprot_handle_pf;
 #ifdef MAC
        if (sigaction(SIGBUS, &sa, NULL) == -1) {
                model_print("SIGACTION CANNOT BE INSTALLED\n");
@@ -150,16 +159,16 @@ static void mprot_snapshot_init(unsigned int numbackingpages,
                exit(EXIT_FAILURE);
        }
 
-       initSnapShotRecord(numbackingpages, numsnapshots, nummemoryregions);
+       mprot_snap = new mprot_snapshotter(numbackingpages, numsnapshots, nummemoryregions);
 
-       // EVIL HACK: We need to make sure that calls into the HandlePF method don't cause dynamic links
+       // EVIL HACK: We need to make sure that calls into the mprot_handle_pf method don't cause dynamic links
        // The problem is that we end up protecting state in the dynamic linker...
        // Solution is to call our signal handler before we start protecting stuff...
 
        siginfo_t si;
        memset(&si, 0, sizeof(si));
        si.si_addr = ss.ss_sp;
-       HandlePF(SIGSEGV, &si, NULL);
+       mprot_handle_pf(SIGSEGV, &si, NULL);
        mprot_snap->lastBackingPage--; //remove the fake page we copied
 
        void *basemySpace = model_malloc((numheappages + 1) * PAGESIZE);