X-Git-Url: http://plrg.eecs.uci.edu/git/?p=model-checker.git;a=blobdiff_plain;f=mymemory.cc;h=ea8670d60ccdf7250307b7ae4bb55bc89f5507c5;hp=6ea6b92927c4ddebabe5b690b13800667a70fd08;hb=db2c4ca161b4cba9e453431517af86798c0e9bdb;hpb=adf77053d498af32ab4c6764b50d4265bed5996c diff --git a/mymemory.cc b/mymemory.cc index 6ea6b92..ea8670d 100644 --- a/mymemory.cc +++ b/mymemory.cc @@ -1,13 +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 "common.h" + #define REQUESTS_BEFORE_ALLOC 1024 -size_t allocatedReqs[ REQUESTS_BEFORE_ALLOC ] = { 0 }; + +size_t allocatedReqs[REQUESTS_BEFORE_ALLOC] = { 0 }; int nextRequest = 0; int howManyFreed = 0; #if !USE_MPROTECT_SNAPSHOT @@ -33,11 +37,8 @@ void *model_calloc(size_t count, size_t size) ptr = callocp(count, size); return ptr; #else - if (!snapshotrecord) { - createSharedMemory(); - } - if (NULL == sStaticSpace) - sStaticSpace = create_mspace_with_base(( void *)( snapshotrecord->mSharedMemoryBase), SHARED_MEMORY_DEFAULT -sizeof(struct SnapShot), 1); + if (!sStaticSpace) + sStaticSpace = create_shared_mspace(); return mspace_calloc(sStaticSpace, count, size); #endif } @@ -61,11 +62,8 @@ void *model_malloc(size_t size) ptr = mallocp(size); return ptr; #else - if (!snapshotrecord) { - createSharedMemory(); - } - if (NULL == sStaticSpace) - sStaticSpace = create_mspace_with_base(( void *)( snapshotrecord->mSharedMemoryBase), SHARED_MEMORY_DEFAULT -sizeof(struct SnapShot), 1); + if (!sStaticSpace) + sStaticSpace = create_shared_mspace(); return mspace_malloc(sStaticSpace, size); #endif } @@ -109,7 +107,7 @@ void model_free(void *ptr) /* get address of libc free */ if (!freep) { - freep = ( void ( * )( void *))dlsym(RTLD_NEXT, "free"); + freep = (void (*)(void *))dlsym(RTLD_NEXT, "free"); if ((error = dlerror()) != NULL) { fputs(error, stderr); exit(EXIT_FAILURE); @@ -121,9 +119,8 @@ void model_free(void *ptr) #endif } -/** Bootstrap allocation. Problem is that the dynamic linker calls - * require calloc to work and calloc requires the dynamic linker to - * work. */ +/** Bootstrap allocation. Problem is that the dynamic linker calls require + * calloc to work and calloc requires the dynamic linker to work. */ #define BOOTSTRAPBYTES 4096 char bootstrapmemory[BOOTSTRAPBYTES]; @@ -139,7 +136,7 @@ void * HandleEarlyAllocationRequest(size_t sz) exit(EXIT_FAILURE); } - void *pointer= (void *)&bootstrapmemory[offset]; + void *pointer = (void *)&bootstrapmemory[offset]; offset += sz; return pointer; } @@ -158,14 +155,30 @@ static bool DontFree(void *ptr) return (ptr >= (&bootstrapmemory[0]) && ptr < (&bootstrapmemory[BOOTSTRAPBYTES])); } -/** @brief Snapshotting malloc implementation for user programs */ +/** + * @brief The allocator function for "user" allocation + * + * Should only be used for allocations which will not disturb the allocation + * patterns of a user thread. + */ +static void * user_malloc(size_t size) +{ + void *tmp = mspace_malloc(user_snapshot_space, size); + ASSERT(tmp); + return tmp; +} + +/** + * @brief Snapshotting malloc implementation for user programs + * + * Do NOT call this function from a model-checker context. Doing so may disrupt + * the allocation patterns of a user thread. + */ void *malloc(size_t size) { - if (user_snapshot_space) { - void *tmp = mspace_malloc(user_snapshot_space, size); - ASSERT(tmp); - return tmp; - } else + if (user_snapshot_space) + return user_malloc(size); + else return HandleEarlyAllocationRequest(size); } @@ -193,11 +206,23 @@ void * calloc(size_t num, size_t size) return tmp; } else { void *tmp = HandleEarlyAllocationRequest(size * num); - std::memset(tmp, 0, size * num); + memset(tmp, 0, size * num); return tmp; } } +/** @brief Snapshotting allocation function for use by the Thread class only */ +void * Thread_malloc(size_t size) +{ + return user_malloc(size); +} + +/** @brief Snapshotting free function for use by the Thread class only */ +void Thread_free(void *ptr) +{ + free(ptr); +} + /** @brief Snapshotting new operator for user programs */ void * operator new(size_t size) throw(std::bad_alloc) {