X-Git-Url: http://plrg.eecs.uci.edu/git/?p=model-checker.git;a=blobdiff_plain;f=mymemory.cc;h=e8ec08050f5d8e5389c01e136fe1c0a27f374f13;hp=a15a13dd522bf54bb0b7e3c7fd49ff014467db56;hb=01f8364dda87f16e1a8823232c2d90de1d5168a6;hpb=6e5c0bb2359b9fba6160957ffa88974233ba18ac diff --git a/mymemory.cc b/mymemory.cc index a15a13d..e8ec080 100644 --- a/mymemory.cc +++ b/mymemory.cc @@ -7,14 +7,16 @@ #include "mymemory.h" #include "snapshot.h" -#include "snapshotimp.h" #include "common.h" +#include "threads-model.h" +#include "model.h" #define REQUESTS_BEFORE_ALLOC 1024 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 @@ -38,10 +40,8 @@ void *model_calloc(size_t count, size_t size) ptr = callocp(count, size); return ptr; #else - if (!snapshotrecord) - createSharedMemory(); if (!sStaticSpace) - sStaticSpace = create_mspace_with_base((void *)(snapshotrecord->mSharedMemoryBase), SHARED_MEMORY_DEFAULT - sizeof(struct SnapShot), 1); + sStaticSpace = create_shared_mspace(); return mspace_calloc(sStaticSpace, count, size); #endif } @@ -65,10 +65,8 @@ void *model_malloc(size_t size) ptr = mallocp(size); return ptr; #else - if (!snapshotrecord) - createSharedMemory(); if (!sStaticSpace) - sStaticSpace = create_mspace_with_base((void *)(snapshotrecord->mSharedMemoryBase), SHARED_MEMORY_DEFAULT - sizeof(struct SnapShot), 1); + sStaticSpace = create_shared_mspace(); return mspace_malloc(sStaticSpace, size); #endif } @@ -127,7 +125,7 @@ void model_free(void *ptr) /** Bootstrap allocation. Problem is that the dynamic linker calls require * calloc to work and calloc requires the dynamic linker to work. */ -#define BOOTSTRAPBYTES 4096 +#define BOOTSTRAPBYTES 131072 char bootstrapmemory[BOOTSTRAPBYTES]; size_t offset = 0; @@ -137,7 +135,7 @@ void * HandleEarlyAllocationRequest(size_t sz) sz = (sz + 7) & ~7; if (sz > (BOOTSTRAPBYTES-offset)) { - model_print("OUT OF BOOTSTRAP MEMORY\n"); + model_print("OUT OF BOOTSTRAP MEMORY. Increase the size of BOOTSTRAPBYTES in mymemory.cc\n"); exit(EXIT_FAILURE); } @@ -160,13 +158,34 @@ 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; + if (switch_alloc) { + return model_malloc(size); + } + /* Only perform user allocations from user context */ + ASSERT(!model || thread_current()); + return user_malloc(size); } else return HandleEarlyAllocationRequest(size); } @@ -174,8 +193,12 @@ void *malloc(size_t size) /** @brief Snapshotting free implementation for user programs */ void free(void * ptr) { - if (!DontFree(ptr)) + if (!DontFree(ptr)) { + if (switch_alloc) { + return model_free(ptr); + } mspace_free(user_snapshot_space, ptr); + } } /** @brief Snapshotting realloc implementation for user programs */ @@ -200,6 +223,18 @@ void * calloc(size_t num, size_t size) } } +/** @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) { @@ -223,4 +258,19 @@ void operator delete[](void *p, size_t size) { free(p); } -#endif /* 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); +} + +/** @brief Snapshotting free function for use by the Thread class only */ +void Thread_free(void *ptr) +{ + free(ptr); +} + +#endif /* !USE_MPROTECT_SNAPSHOT */