X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=mymemory.cc;h=3d5168f95571abb4f36afc848a4be1073c7abda8;hb=HEAD;hp=efc36e98c8be4b607bb0927936beed7e6769712f;hpb=3b5768f03aa10fbb9d909850a7f394c4561ecb9e;p=c11tester.git diff --git a/mymemory.cc b/mymemory.cc index efc36e98..3d5168f9 100644 --- a/mymemory.cc +++ b/mymemory.cc @@ -18,29 +18,23 @@ size_t allocatedReqs[REQUESTS_BEFORE_ALLOC] = { 0 }; int nextRequest = 0; int howManyFreed = 0; -static mspace sStaticSpace = NULL; +mspace sStaticSpace = NULL; /** Non-snapshotting calloc for our use. */ void *model_calloc(size_t count, size_t size) { - if (!sStaticSpace) - sStaticSpace = create_shared_mspace(); return mspace_calloc(sStaticSpace, count, size); } /** Non-snapshotting malloc for our use. */ void *model_malloc(size_t size) { - if (!sStaticSpace) - sStaticSpace = create_shared_mspace(); return mspace_malloc(sStaticSpace, size); } /** Non-snapshotting malloc for our use. */ void *model_realloc(void *ptr, size_t size) { - if (!sStaticSpace) - sStaticSpace = create_shared_mspace(); return mspace_realloc(sStaticSpace, ptr, size); } @@ -116,3 +110,91 @@ void Thread_free(void *ptr) { snapshot_free(ptr); } + +void * (*volatile real_memcpy)(void * dst, const void *src, size_t n) = NULL; +void * (*volatile real_memmove)(void * dst, const void *src, size_t len) = NULL; +void (*volatile real_bzero)(void * dst, size_t len) = NULL; +void * (*volatile real_memset)(void * dst, int c, size_t len) = NULL; + +void init_memory_ops() +{ + if (!real_memcpy) { + real_memcpy = (void * (*)(void * dst, const void *src, size_t n)) 1; + real_memcpy = (void * (*)(void * dst, const void *src, size_t n))dlsym(RTLD_NEXT, "memcpy"); + } + if (!real_memmove) { + real_memmove = (void * (*)(void * dst, const void *src, size_t n)) 1; + real_memmove = (void * (*)(void * dst, const void *src, size_t n))dlsym(RTLD_NEXT, "memmove"); + } + if (!real_memset) { + real_memset = (void * (*)(void * dst, int c, size_t n)) 1; + real_memset = (void * (*)(void * dst, int c, size_t n))dlsym(RTLD_NEXT, "memset"); + } + if (!real_bzero) { + real_bzero = (void (*)(void * dst, size_t len)) 1; + real_bzero = (void (*)(void * dst, size_t len))dlsym(RTLD_NEXT, "bzero"); + } +} + +void * memcpy(void * dst, const void * src, size_t n) { + if (model && !inside_model) { + //model_print("memcpy size: %d\n", n); + thread_id_t tid = thread_current_id(); + raceCheckReadMemop(tid, (void *)src, n); + raceCheckWriteMemop(tid, (void *)dst, n); + } else if (((uintptr_t)real_memcpy) < 2) { + for(uint i=0;i