X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=mymemory.cc;h=f78e82d567af00313f4cba654d41bff564b1a6bb;hb=bbc0bd0561362e1cb93c04fddc165b49d83c24ed;hp=4182e094e5251c1a8efedbe8a92c232c012f13f3;hpb=3897cb4ac31fe710f2333bd6ca917144b58844f2;p=c11tester.git diff --git a/mymemory.cc b/mymemory.cc index 4182e094..f78e82d5 100644 --- a/mymemory.cc +++ b/mymemory.cc @@ -1,3 +1,4 @@ + #include #include #include @@ -10,6 +11,7 @@ #include "common.h" #include "threads-model.h" #include "model.h" +#include "datarace.h" #define REQUESTS_BEFORE_ALLOC 1024 @@ -70,6 +72,31 @@ void *model_malloc(size_t size) #endif } +/** Non-snapshotting malloc for our use. */ +void *model_realloc(void *ptr, size_t size) +{ +#if USE_MPROTECT_SNAPSHOT + static void *(*reallocp)(void *ptr, size_t size) = NULL; + char *error; + void *newptr; + + /* get address of libc malloc */ + if (!reallocp) { + reallocp = (void * (*)(size_t))dlsym(RTLD_NEXT, "realloc"); + if ((error = dlerror()) != NULL) { + fputs(error, stderr); + exit(EXIT_FAILURE); + } + } + newptr = reallocp(ptr, size); + return newptr; +#else + if (!sStaticSpace) + sStaticSpace = create_shared_mspace(); + return mspace_realloc(sStaticSpace, ptr, size); +#endif +} + /** @brief Snapshotting malloc, for use by model-checker (not user progs) */ void * snapshot_malloc(size_t size) { @@ -178,25 +205,30 @@ static void * user_malloc(size_t size) */ void *malloc(size_t size) { + void *tmp; if (user_snapshot_space) { /* Only perform user allocations from user context */ ASSERT(!model || thread_current()); - return user_malloc(size); + tmp = user_malloc(size); } else - return HandleEarlyAllocationRequest(size); + tmp = HandleEarlyAllocationRequest(size); + recordCalloc(tmp, size); + return tmp; } /** @brief Snapshotting free implementation for user programs */ void free(void * ptr) { - if (!DontFree(ptr)) + if (!DontFree(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(user_snapshot_space, ptr, size); + recordCalloc(tmp, size); ASSERT(tmp); return tmp; } @@ -207,10 +239,12 @@ void * calloc(size_t num, size_t size) if (user_snapshot_space) { void *tmp = mspace_calloc(user_snapshot_space, num, size); ASSERT(tmp); + recordAlloc(tmp, num*size); return tmp; } else { void *tmp = HandleEarlyAllocationRequest(size * num); memset(tmp, 0, size * num); + recordAlloc(tmp, num*size); return tmp; } } @@ -251,18 +285,18 @@ void operator delete[](void *p, size_t size) free(p); } -#else /* !USE_MPROTECT_SNAPSHOT */ +#else /* !USE_MPROTECT_SNAPSHOT */ /** @brief Snapshotting allocation function for use by the Thread class only */ void * Thread_malloc(size_t size) { - return malloc(size); + return snapshot_malloc(size); } /** @brief Snapshotting free function for use by the Thread class only */ void Thread_free(void *ptr) { - free(ptr); + snapshot_free(ptr); } -#endif /* !USE_MPROTECT_SNAPSHOT */ +#endif /* !USE_MPROTECT_SNAPSHOT */