4 * Copyright (c) 2000 - 2013 Samsung Electronics Co., Ltd. All rights reserved.
8 * Jaewon Lim <jaewon81.lim@samsung.com>
9 * Woojin Jung <woojin2.jung@samsung.com>
10 * Juyoung Kim <j0.kim@samsung.com>
11 * Anastasia Lyupa <a.lyupa@samsung.com>
12 * Dmitry Bogatov <d.bogatov@samsung.com>
14 * This library is free software; you can redistribute it and/or modify it under
15 * the terms of the GNU Lesser General Public License as published by the
16 * Free Software Foundation; either version 2.1 of the License, or (at your option)
19 * This library is distributed in the hope that it will be useful, but WITHOUT ANY
20 * WARRANTY; without even the implied warranty of MERCHANTABILITY or
21 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
22 * License for more details.
24 * You should have received a copy of the GNU Lesser General Public License
25 * along with this library; if not, write to the Free Software Foundation, Inc., 51
26 * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
30 * - Samsung RnD Institute Russia
43 #include "probeinfo.h"
44 #include "dacollection.h"
46 #include "da_memory.h"
49 static enum DaOptions _sopt = OPT_ALLOC;
51 static void* (*saved_malloc_hook)(size_t, const void*);
52 static void* malloc_hook(size_t, const void*);
53 static void* (*saved_realloc_hook)(void*, size_t, const void*);
54 static void* realloc_hook(void*, size_t, const void*);
55 static void (*saved_free_hook)(void*, const void*);
56 static void free_hook(void*, const void*);
58 static void install_memory_hooks()
60 __malloc_hook = malloc_hook;
61 __realloc_hook = realloc_hook;
62 __free_hook = free_hook;
64 static void teardown_memory_hooks()
66 __malloc_hook = saved_malloc_hook;
67 __realloc_hook = saved_realloc_hook;
68 __free_hook = saved_free_hook;
71 void memory_initialize_hook(void)
73 saved_malloc_hook = __malloc_hook;
74 saved_realloc_hook = __realloc_hook;
75 saved_free_hook = __free_hook;
76 install_memory_hooks();
79 static void *malloc_hook(size_t size, const void* caller)
81 DECLARE_VARIABLE_STANDARD;
84 teardown_memory_hooks();
89 if(pret != NULL && getTraceState() == 0)
91 add_memory_hash(pret, size, MEMTYPE_ALLOC, blockresult ? MEM_EXTERNAL : MEM_INTERNAL);
94 POST_PACK_PROBEBLOCK_BEGIN();
97 PACK_COMMON_BEGIN(MSG_PROBE_MEMORY,
100 PACK_COMMON_END(pret, newerrno, blockresult);
101 PACK_MEMORY(size, MEMORY_API_ALLOC, pret);
104 POST_PACK_PROBEBLOCK_END();
106 install_memory_hooks();
111 static void free_hook(void *ptr, const void *caller)
113 DECLARE_VARIABLE_STANDARD;
115 teardown_memory_hooks();
119 if(ptr != NULL && getTraceState() == 0)
121 del_memory_hash(ptr, MEMTYPE_FREE, NULL);
126 POST_PACK_PROBEBLOCK_BEGIN();
129 PACK_COMMON_BEGIN(MSG_PROBE_MEMORY,
132 PACK_COMMON_END(0, newerrno, blockresult);
133 PACK_MEMORY(0, MEMORY_API_FREE, ptr);
136 POST_PACK_PROBEBLOCK_END();
138 install_memory_hooks();
141 static void* realloc_hook(void *memblock, size_t size, const void* caller)
143 DECLARE_VARIABLE_STANDARD;
146 teardown_memory_hooks();
150 if(memblock != NULL && getTraceState() == 0)
152 del_memory_hash(memblock, MEMTYPE_FREE, NULL);
155 pret = realloc(memblock, size);
157 if(pret != NULL && getTraceState() == 0)
159 add_memory_hash(pret, size, MEMTYPE_ALLOC, blockresult ? MEM_EXTERNAL : MEM_INTERNAL);
162 POST_PACK_PROBEBLOCK_BEGIN();
165 PACK_COMMON_BEGIN(MSG_PROBE_MEMORY,
167 "pxp", memblock, size, caller);
168 PACK_COMMON_END(pret, newerrno, blockresult);
169 PACK_MEMORY(size, MEMORY_API_ALLOC, pret);
172 POST_PACK_PROBEBLOCK_END();
174 install_memory_hooks();
179 static inline void adhoc_bzero(char *p, size_t size)
182 for (index = 0; index != size; index++)
186 void *calloc(size_t nelem, size_t elsize)
188 DECLARE_VARIABLE_STANDARD;
190 size_t size = nelem * elsize;
193 pret = (size < elsize) ? NULL : malloc(size);
194 if (pret) /* `memset' somewhy deadloops */
195 adhoc_bzero(pret, nelem * elsize);
197 if(pret != NULL && getTraceState() == 0)
199 add_memory_hash(pret, nelem * elsize, MEMTYPE_ALLOC, blockresult ? MEM_EXTERNAL : MEM_INTERNAL);
202 POST_PACK_PROBEBLOCK_BEGIN();
205 PACK_COMMON_BEGIN(MSG_PROBE_MEMORY,
207 "xx", nelem, elsize);
208 PACK_COMMON_END(pret, newerrno, blockresult);
209 PACK_MEMORY(nelem * elsize, MEMORY_API_ALLOC, pret);
212 POST_PACK_PROBEBLOCK_END();