X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=mymemory.cc;h=e8ec08050f5d8e5389c01e136fe1c0a27f374f13;hb=refs%2Fheads%2Fmaster;hp=ea8670d60ccdf7250307b7ae4bb55bc89f5507c5;hpb=db2c4ca161b4cba9e453431517af86798c0e9bdb;p=model-checker.git diff --git a/mymemory.cc b/mymemory.cc index ea8670d..e8ec080 100644 --- a/mymemory.cc +++ b/mymemory.cc @@ -8,12 +8,15 @@ #include "mymemory.h" #include "snapshot.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 @@ -122,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; @@ -132,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); } @@ -176,17 +179,26 @@ static void * user_malloc(size_t size) */ void *malloc(size_t size) { - if (user_snapshot_space) + 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); - else + } else return HandleEarlyAllocationRequest(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 */ @@ -246,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 */