From: Brian Demsky Date: Thu, 15 Nov 2012 02:15:04 +0000 (-0800) Subject: merge X-Git-Tag: oopsla2013~539^2 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=45206350b4022732229f8a48a3c7b08885e874a7;hp=4bb070b43345c8617c6c627e2b9b24039affb6b7;p=model-checker.git merge Merge branch 'master' of ssh://demsky.eecs.uci.edu/home/git/model-checker Conflicts: config.h model.cc --- diff --git a/config.h b/config.h index e064e39..aacbb81 100644 --- a/config.h +++ b/config.h @@ -48,6 +48,9 @@ /* Size of stack to allocate for a thread. */ #define STACK_SIZE (1024 * 1024) +/** How many shadow tables of memory to preallocate for data race detector. */ +#define SHADOWBASETABLES 4 + /** Enable debugging assertions (via ASSERT()) */ #define CONFIG_ASSERT diff --git a/datarace.cc b/datarace.cc index e6bbe05..ac364d7 100644 --- a/datarace.cc +++ b/datarace.cc @@ -5,13 +5,29 @@ #include #include "mymemory.h" #include "clockvector.h" +#include "config.h" struct ShadowTable *root; std::vector unrealizedraces; +void *memory_base; +void *memory_top; + /** This function initialized the data race detector. */ void initRaceDetector() { root = (struct ShadowTable *)snapshot_calloc(sizeof(struct ShadowTable), 1); + memory_base = snapshot_calloc(sizeof(struct ShadowBaseTable)*SHADOWBASETABLES, 1); + memory_top = ((char *)memory_base) + sizeof(struct ShadowBaseTable)*SHADOWBASETABLES; +} + +void * table_calloc(size_t size) { + if ((((char *)memory_base)+size)>memory_top) { + return snapshot_calloc(size, 1); + } else { + void *tmp=memory_base; + memory_base=((char *)memory_base)+size; + return tmp; + } } /** This function looks up the entry in the shadow table corresponding to a @@ -21,13 +37,13 @@ static uint64_t * lookupAddressEntry(const void * address) { #if BIT48 currtable=(struct ShadowTable *) currtable->array[(((uintptr_t)address)>>32)&MASK16BIT]; if (currtable==NULL) { - currtable = (struct ShadowTable *)(root->array[(((uintptr_t)address)>>32)&MASK16BIT] = snapshot_calloc(sizeof(struct ShadowTable), 1)); + currtable = (struct ShadowTable *)(root->array[(((uintptr_t)address)>>32)&MASK16BIT] = table_calloc(sizeof(struct ShadowTable))); } #endif struct ShadowBaseTable * basetable=(struct ShadowBaseTable *) currtable->array[(((uintptr_t)address)>>16)&MASK16BIT]; if (basetable==NULL) { - basetable = (struct ShadowBaseTable *)(currtable->array[(((uintptr_t)address)>>16)&MASK16BIT] = snapshot_calloc(sizeof(struct ShadowBaseTable), 1)); + basetable = (struct ShadowBaseTable *)(currtable->array[(((uintptr_t)address)>>16)&MASK16BIT] = table_calloc(sizeof(struct ShadowBaseTable))); } return &basetable->array[((uintptr_t)address)&MASK16BIT]; }