2 * Copyright (c) 2016, Olivier MATZ <zer0@droids-corp.org>
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the University of California, Berkeley nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
16 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 #include <sys/types.h>
35 typedef void *(*ec_malloc_t)(size_t size, const char *file, unsigned int line);
36 typedef void (*ec_free_t)(void *ptr, const char *file, unsigned int line);
37 typedef void *(*ec_realloc_t)(void *ptr, size_t size, const char *file,
40 struct ec_malloc_handler {
46 extern struct ec_malloc_handler ec_malloc_handler;
48 int ec_malloc_register(ec_malloc_t usr_malloc, ec_free_t usr_free,
49 ec_realloc_t usr_realloc);
50 void ec_malloc_unregister(void);
53 void *__ec_malloc(size_t size, const char *file, unsigned int line);
54 void __ec_free(void *ptr, const char *file, unsigned int line);
55 void *__ec_calloc(size_t nmemb, size_t size, const char *file,
57 void *__ec_realloc(void *ptr, size_t size, const char *file, unsigned int line);
58 char *__ec_strdup(const char *s, const char *file, unsigned int line);
59 char *__ec_strndup(const char *s, size_t n, const char *file,
62 /* XXX rename into ec_malloc, and change macro to uppercase */
63 void *ec_malloc2(size_t size);
64 void ec_free2(void *ptr);
66 /* we use macros here to ensure the file/line stay correct when
67 * debugging the standard malloc with valgrind */
69 #define ec_malloc(sz) ({ \
71 if (ec_malloc_handler.malloc == NULL) \
74 ret_ = __ec_malloc(sz, __FILE__, __LINE__); \
78 #define ec_free(ptr) ({ \
79 if (ec_malloc_handler.free == NULL) \
82 __ec_free(ptr, __FILE__, __LINE__); \
85 #define ec_realloc(ptr, sz) ({ \
87 if (ec_malloc_handler.realloc == NULL) \
88 ret_ = realloc(ptr, sz); \
90 ret_ = __ec_realloc(ptr, sz, __FILE__, __LINE__); \
94 #define ec_calloc(n, sz) ({ \
96 if (ec_malloc_handler.malloc == NULL) \
97 ret_ = calloc(n, sz); \
99 ret_ = __ec_calloc(n, sz, __FILE__, __LINE__); \
103 #define ec_strdup(s) ({ \
105 if (ec_malloc_handler.malloc == NULL) \
108 ret_ = __ec_strdup(s, __FILE__, __LINE__); \
112 #define ec_strndup(s, n) ({ \
114 if (ec_malloc_handler.malloc == NULL) \
115 ret_ = strndup(s, n); \
117 ret_ = __ec_strndup(s, n, __FILE__, __LINE__); \