X-Git-Url: http://plrg.eecs.uci.edu/git/?p=c11tester.git;a=blobdiff_plain;f=mymemory.cc;h=1f8b616020e481e795fd36f74bfa1d2ab56722cc;hp=84600ae9d39ebac840d9cfe606bb5b030778b170;hb=e102155b9b54d88cf310d8eba39a42aa51a1aec2;hpb=bac8bc0661e904fc2b1b9aba07d239679483b2b4 diff --git a/mymemory.cc b/mymemory.cc index 84600ae9..1f8b6160 100644 --- a/mymemory.cc +++ b/mymemory.cc @@ -1,3 +1,4 @@ + #include #include #include @@ -16,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 @@ -71,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 = malloc(size); + void *tmp = mspace_malloc(model_snapshot_space, size); ASSERT(tmp); return tmp; } @@ -82,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 = calloc(count, size); + void *tmp = mspace_calloc(model_snapshot_space, count, size); ASSERT(tmp); return tmp; } @@ -90,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 = realloc(ptr, size); + void *tmp = mspace_realloc(model_snapshot_space, ptr, size); ASSERT(tmp); return tmp; } @@ -98,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) { - free(ptr); + mspace_free(model_snapshot_space, ptr); } /** Non-snapshotting free for our use. */ @@ -180,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); @@ -194,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); } } @@ -264,13 +283,13 @@ void operator delete[](void *p, size_t size) /** @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 */