From: DJ Delorie Date: Sat, 19 Mar 2016 02:19:43 +0000 (-0400) Subject: Merge branch 'master' into dj/malloc X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5bd0885c9ddf14ddb959742fcb0d4b2368d7b44f;p=thirdparty%2Fglibc.git Merge branch 'master' into dj/malloc --- 5bd0885c9ddf14ddb959742fcb0d4b2368d7b44f diff --cc malloc/malloc.c index e4616ca4119,1eed79414c5..453311d26f9 --- a/malloc/malloc.c +++ b/malloc/malloc.c @@@ -1074,86 -1073,9 +1073,84 @@@ static void* realloc_check(void* oldm const void *caller); static void* memalign_check(size_t alignment, size_t bytes, const void *caller); - #ifndef NO_THREADS static void* malloc_atfork(size_t sz, const void *caller); static void free_atfork(void* mem, const void *caller); - #endif +/* ------------------ TRACE support ------------------ */ +#define USE_MTRACE 1 +#if USE_MTRACE +#include "mtrace.h" + +volatile __malloc_trace_buffer_ptr __malloc_trace_buffer = NULL; +volatile size_t __malloc_trace_buffer_size = 0; +volatile size_t __malloc_trace_buffer_head = 0; + +static __thread __malloc_trace_buffer_ptr trace_ptr; + +static void +__mtb_trace_entry (uint32_t type, int64_t size, void *ptr1) +{ + size_t head1; + + head1 = catomic_exchange_and_add (&__malloc_trace_buffer_head, 1); + + trace_ptr = __malloc_trace_buffer + (head1 % __malloc_trace_buffer_size); + + trace_ptr->thread = syscall(__NR_gettid); + trace_ptr->type = type; + trace_ptr->path_thread_cache = 0; + trace_ptr->path_cpu_cache = 0; + trace_ptr->path_cpu_cache2 = 0; + trace_ptr->path_sbrk = 0; + trace_ptr->path_mmap = 0; + trace_ptr->path_munmap = 0; + trace_ptr->path_m_f_realloc = 0; + trace_ptr->path = 0; + trace_ptr->size = size; + trace_ptr->ptr1 = (uint64_t) ptr1; + trace_ptr->ptr2 = 0; +} + +int +__malloc_set_trace_buffer (void *bufptr, size_t bufsize) +{ + __malloc_trace_buffer = 0; + __malloc_trace_buffer_size = bufsize / sizeof(struct __malloc_trace_buffer_s); + __malloc_trace_buffer_head = 0; + __malloc_trace_buffer = (__malloc_trace_buffer_ptr) bufptr; + return sizeof(struct __malloc_trace_buffer_s); +} + +void * +__malloc_get_trace_buffer (size_t *bufcount, size_t *bufhead) +{ + if (bufcount) + *bufcount = __malloc_trace_buffer_size; + if (bufhead) + *bufhead = __malloc_trace_buffer_head; + return __malloc_trace_buffer; +} + +#define __MTB_TRACE_ENTRY(type,size,ptr1) \ + if (__builtin_expect (__malloc_trace_buffer != NULL, 0)) \ + __mtb_trace_entry (__MTB_TYPE_##type,size,ptr1); \ + else \ + trace_ptr = 0; + +#define __MTB_TRACE_PATH(mpath) \ + if (__builtin_expect (trace_ptr != NULL, 1)) \ + trace_ptr->path_##mpath = 1; + +#define __MTB_TRACE_SET(var,value) \ + if (__builtin_expect (trace_ptr != NULL, 1)) \ + trace_ptr->var = (uint64_t) value; + +#else +#define __MTB_TRACE_ENTRY(type,size,ptr1) +#define __MTB_TRACE_PATH(mpath) +#define __MTB_TRACE_SET(var,value) +#endif + /* ------------------ MMAP support ------------------ */