X-Git-Url: http://demsky.eecs.uci.edu/git/?p=model-checker.git;a=blobdiff_plain;f=mymemory.cc;h=9e05c369235dadb077b6d09b1cfb7b2ece92180f;hp=5c11d473a34d5420c6b1a01e109f9f619355058f;hb=2d0d4ac38e05905a6633b3f2d5112ccadd45c27f;hpb=421c3af5d7265b26a4c946a710f2acd986c5d78a diff --git a/mymemory.cc b/mymemory.cc index 5c11d47..9e05c36 100644 --- a/mymemory.cc +++ b/mymemory.cc @@ -7,8 +7,9 @@ #include "mymemory.h" #include "snapshot.h" -#include "snapshotimp.h" #include "common.h" +#include "threads-model.h" +#include "model.h" #define REQUESTS_BEFORE_ALLOC 1024 @@ -156,13 +157,31 @@ 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; + /* Only perform user allocations from user context */ + ASSERT(!model || thread_current()); + return user_malloc(size); } else return HandleEarlyAllocationRequest(size); } @@ -196,6 +215,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) { @@ -219,4 +250,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 */