7675eb464d9f79802d61b2fcbff53b9751671036
[ust.git] / libmallocwrap / mallocwrap.c
1 #define _GNU_SOURCE
2 #include <dlfcn.h>
3 #include <sys/types.h>
4 #include <stdio.h>
5
6 #include "marker.h"
7
8 #if 0
9 INTERCEPT_PROTOTYPE(void, malloc, size_t size)
10 INTERCEPT_TRACE("size %d", size)
11 INTERCEPT_CALL_ARGS(size)
12 INTERCEPT()
13
14 #define INTERCEPT_FUNC(type, name, args...) \
15 __I_FUNC_TYPE(type) \
16 __I_FUNC_NAME(name) \
17 __I_FUNC_ARGS(args)
18
19 #define INTERCEPT_TRACE(fmt, args...) \
20 #define __I_TRACE_FMT fmt \
21 #define __I_TRACE_ARGS args
22
23 #define INTERCEPT_CALL_ARGS(args...) \
24 #define __I_CALL_ARGS args
25
26 #define INTERCEPT() \
27 __I_FUNC_TYPE __I_FUNC_NAME(__I_FUNC_ARGS) \
28 { \
29 static __I_FUNC_TYPE (*plibc_ ## __I_FUNC_NAME)(args) = NULL; \
30 \
31 if(plibc_ ## __I_FUNC_NAME == NULL) { \
32 plibc_ ## __I_FUNC_NAME = dlsym(RTLD_NEXT, "malloc"); \
33 if(plibc_ ## __I_FUNC_NAME == NULL) { \
34 fprintf(stderr, "mallocwrap: unable to find malloc\n"); \
35 return NULL; \
36 } \
37 } \
38 \
39 trace_mark(ust, __I_FUNC_NAME, __I_TRACE_FMT, __I_TRACE_ARGS); \
40 \
41 return plibc_ ## __I_FUNC_NAME (__I_CALL_ARGS); \
42 }
43 #endif
44
45 void *malloc(size_t size)
46 {
47 static void *(*plibc_malloc)(size_t size) = NULL;
48
49 void *retval;
50
51 if(plibc_malloc == NULL) {
52 plibc_malloc = dlsym(RTLD_NEXT, "malloc");
53 if(plibc_malloc == NULL) {
54 fprintf(stderr, "mallocwrap: unable to find malloc\n");
55 return NULL;
56 }
57 }
58
59 retval = plibc_malloc(size);
60
61 trace_mark(ust, malloc, "size %d ptr %p", (int)size, retval);
62
63 return retval;
64 }
65
66 void free(void *ptr)
67 {
68 static void *(*plibc_free)(void *ptr) = NULL;
69
70 if(plibc_free == NULL) {
71 plibc_free = dlsym(RTLD_NEXT, "free");
72 if(plibc_free == NULL) {
73 fprintf(stderr, "mallocwrap: unable to find free\n");
74 return NULL;
75 }
76 }
77
78 trace_mark(ust, free, "%p", ptr);
79
80 return plibc_free(ptr);
81 }
82
83 MARKER_LIB
This page took 0.029293 seconds and 3 git commands to generate.