X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=mymemory.cc;h=e05cb783e2455bdf68aaa5b495fa664e000677f2;hb=fc32611957cecd106751b62bc4de4aeddc9af56c;hp=759bdccd89231eff77305f392166162d8c714de4;hpb=ea58bae0f4b142d118880a3eb71168604c513b07;p=model-checker.git diff --git a/mymemory.cc b/mymemory.cc index 759bdcc..e05cb78 100644 --- a/mymemory.cc +++ b/mymemory.cc @@ -1,12 +1,17 @@ -#include "mymemory.h" -#include "snapshot.h" -#include "snapshotimp.h" +#include #include #include #include -#include +#include +#include + +#include "mymemory.h" +#include "snapshot.h" +#include "snapshotimp.h" #include "common.h" + #define REQUESTS_BEFORE_ALLOC 1024 + size_t allocatedReqs[ REQUESTS_BEFORE_ALLOC ] = { 0 }; int nextRequest = 0; int howManyFreed = 0; @@ -73,37 +78,31 @@ void *model_malloc(size_t size) /** @brief Snapshotting malloc, for use by model-checker (not user progs) */ void * snapshot_malloc(size_t size) { - return malloc(size); + void *tmp = mspace_malloc(model_snapshot_space, size); + ASSERT(tmp); + return tmp; } /** @brief Snapshotting calloc, for use by model-checker (not user progs) */ void * snapshot_calloc(size_t count, size_t size) { - return calloc(count, size); + void *tmp = mspace_calloc(model_snapshot_space, count, size); + ASSERT(tmp); + return tmp; } -/** @brief Snapshotting free, for use by model-checker (not user progs) */ -void snapshot_free(void *ptr) +/** @brief Snapshotting realloc, for use by model-checker (not user progs) */ +void *snapshot_realloc(void *ptr, size_t size) { - free(ptr); + void *tmp = mspace_realloc(model_snapshot_space, ptr, size); + ASSERT(tmp); + return tmp; } -void *system_malloc(size_t size) +/** @brief Snapshotting free, for use by model-checker (not user progs) */ +void snapshot_free(void *ptr) { - static void *(*mallocp)(size_t size); - char *error; - void *ptr; - - /* get address of libc malloc */ - if (!mallocp) { - mallocp = (void * (*)(size_t))dlsym(RTLD_NEXT, "malloc"); - if ((error = dlerror()) != NULL) { - fputs(error, stderr); - exit(EXIT_FAILURE); - } - } - ptr = mallocp(size); - return ptr; + mspace_free(model_snapshot_space, ptr); } /** Non-snapshotting free for our use. */ @@ -127,9 +126,6 @@ void model_free(void *ptr) #endif } -/** @brief Global mspace reference for the snapshotting heap */ -mspace mySpace = NULL; - /** Bootstrap allocation. Problem is that the dynamic linker calls * require calloc to work and calloc requires the dynamic linker to * work. */ @@ -144,7 +140,7 @@ void * HandleEarlyAllocationRequest(size_t sz) sz = (sz + 7) & ~7; if (sz > (BOOTSTRAPBYTES-offset)) { - printf("OUT OF BOOTSTRAP MEMORY\n"); + model_print("OUT OF BOOTSTRAP MEMORY\n"); exit(EXIT_FAILURE); } @@ -153,6 +149,14 @@ void * HandleEarlyAllocationRequest(size_t sz) return pointer; } +/** @brief Global mspace reference for the model-checker's snapshotting heap */ +mspace model_snapshot_space = NULL; + +#if USE_MPROTECT_SNAPSHOT + +/** @brief Global mspace reference for the user's snapshotting heap */ +mspace user_snapshot_space = NULL; + /** Check whether this is bootstrapped memory that we should not free */ static bool DontFree(void *ptr) { @@ -162,8 +166,8 @@ static bool DontFree(void *ptr) /** @brief Snapshotting malloc implementation for user programs */ void *malloc(size_t size) { - if (mySpace) { - void *tmp = mspace_malloc(mySpace, size); + if (user_snapshot_space) { + void *tmp = mspace_malloc(user_snapshot_space, size); ASSERT(tmp); return tmp; } else @@ -174,13 +178,13 @@ void *malloc(size_t size) void free(void * ptr) { if (!DontFree(ptr)) - mspace_free(mySpace, ptr); + mspace_free(user_snapshot_space, ptr); } /** @brief Snapshotting realloc implementation for user programs */ void *realloc(void *ptr, size_t size) { - void *tmp = mspace_realloc(mySpace, ptr, size); + void *tmp = mspace_realloc(user_snapshot_space, ptr, size); ASSERT(tmp); return tmp; } @@ -188,13 +192,13 @@ void *realloc(void *ptr, size_t size) /** @brief Snapshotting calloc implementation for user programs */ void * calloc(size_t num, size_t size) { - if (mySpace) { - void *tmp = mspace_calloc(mySpace, num, size); + if (user_snapshot_space) { + void *tmp = mspace_calloc(user_snapshot_space, num, size); ASSERT(tmp); return tmp; } else { void *tmp = HandleEarlyAllocationRequest(size * num); - std::memset(tmp, 0, size * num); + memset(tmp, 0, size * num); return tmp; } } @@ -222,3 +226,4 @@ void operator delete[](void *p, size_t size) { free(p); } +#endif /* USE_MPROTECT_SNAPSHOT */