#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
-#include <map>
+#include "hashtable.h"
#include <cstring>
#include <cstdio>
#include "snapshot.h"
#include <sys/wait.h>
#include <ucontext.h>
+#include "common.h"
+
#define FAILURE(mesg) { printf("failed in the API: %s with errno relative message: %s\n", mesg, strerror( errno ) ); exit(EXIT_FAILURE); }
#ifdef CONFIG_SSDEBUG
static void HandlePF( int sig, siginfo_t *si, void * unused){
if( si->si_code == SEGV_MAPERR ){
printf("Real Fault at %p\n", si->si_addr);
+ print_trace();
exit( EXIT_FAILURE );
}
void* addr = ReturnPageAlignedAddress(si->si_addr);
*/
void rollBack( snapshot_id theID ){
#if USE_MPROTECT_SNAPSHOT
- std::map< void *, bool, std::less< void * >, MyAlloc< std::pair< const void *, bool > > > duplicateMap;
+ HashTable< void *, bool, uintptr_t, 4, MYMALLOC, MYCALLOC, MYFREE> duplicateMap;
for(unsigned int region=0; region<snapshotrecord->lastRegion;region++) {
if( mprotect(snapshotrecord->regionsToSnapShot[region].basePtr, snapshotrecord->regionsToSnapShot[region].sizeInPages*sizeof(struct SnapShotPage), PROT_READ | PROT_WRITE ) == -1 ){
perror("mprotect");
}
}
for(unsigned int page=snapshotrecord->snapShots[theID].firstBackingPage; page<snapshotrecord->lastBackingPage; page++) {
- bool oldVal = false;
- if( duplicateMap.find( snapshotrecord->backingRecords[page].basePtrOfPage ) != duplicateMap.end() ){
- oldVal = true;
- }
- else{
- duplicateMap[ snapshotrecord->backingRecords[page].basePtrOfPage ] = true;
- }
- if( !oldVal ){
+ if( !duplicateMap.contains(snapshotrecord->backingRecords[page].basePtrOfPage )) {
+ duplicateMap.put(snapshotrecord->backingRecords[page].basePtrOfPage, true);
memcpy(snapshotrecord->backingRecords[page].basePtrOfPage, &snapshotrecord->backingStore[page], sizeof(struct SnapShotPage));
}
}