const void *caller);
static void* memalign_check(size_t alignment, size_t bytes,
const void *caller);
- static void* malloc_atfork(size_t sz, const void *caller);
- static void free_atfork(void* mem, const void *caller);
+/* ------------------ 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 ------------------ */