X-Git-Url: http://plrg.eecs.uci.edu/git/?p=c11tester.git;a=blobdiff_plain;f=mymemory.cc;h=1f8b616020e481e795fd36f74bfa1d2ab56722cc;hp=e72c1421f011a7297b33da2eb2a6c026b92bc3c9;hb=32442ab0e9d10b0a8a6a89ae04a3fcd80729da77;hpb=f186d74da258bf0a24b57b13a10b40641e09efd6 diff --git a/mymemory.cc b/mymemory.cc index e72c1421..1f8b6160 100644 --- a/mymemory.cc +++ b/mymemory.cc @@ -17,7 +17,6 @@ size_t allocatedReqs[REQUESTS_BEFORE_ALLOC] = { 0 }; int nextRequest = 0; int howManyFreed = 0; -int switch_alloc = 0; #if !USE_MPROTECT_SNAPSHOT static mspace sStaticSpace = NULL; #endif @@ -72,10 +71,35 @@ 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) { - void *tmp = mspace_malloc(model_snapshot_space, size); + void *tmp = mspace_malloc(model_snapshot_space, size); ASSERT(tmp); return tmp; } @@ -83,7 +107,7 @@ void * snapshot_malloc(size_t size) /** @brief Snapshotting calloc, for use by model-checker (not user progs) */ void * snapshot_calloc(size_t count, size_t size) { - void *tmp = mspace_calloc(model_snapshot_space, count, size); + void *tmp = mspace_calloc(model_snapshot_space, count, size); ASSERT(tmp); return tmp; } @@ -91,7 +115,7 @@ void * snapshot_calloc(size_t count, size_t size) /** @brief Snapshotting realloc, for use by model-checker (not user progs) */ void *snapshot_realloc(void *ptr, size_t size) { - void *tmp = mspace_realloc(model_snapshot_space, ptr, size); + void *tmp = mspace_realloc(model_snapshot_space, ptr, size); ASSERT(tmp); return tmp; } @@ -99,7 +123,7 @@ void *snapshot_realloc(void *ptr, size_t size) /** @brief Snapshotting free, for use by model-checker (not user progs) */ void snapshot_free(void *ptr) { - mspace_free(model_snapshot_space, ptr); + mspace_free(model_snapshot_space, ptr); } /** Non-snapshotting free for our use. */ @@ -181,9 +205,6 @@ static void * user_malloc(size_t size) void *malloc(size_t size) { if (user_snapshot_space) { - if (switch_alloc) { - return model_malloc(size); - } /* Only perform user allocations from user context */ ASSERT(!model || thread_current()); return user_malloc(size); @@ -195,9 +216,6 @@ void *malloc(size_t size) void free(void * ptr) { if (!DontFree(ptr)) { - if (switch_alloc) { - return model_free(ptr); - } mspace_free(user_snapshot_space, ptr); } }