| 1186 | } |
| 1187 | |
| 1188 | extern "C" PERFTOOLS_DLL_DECL void* tc_realloc(void* ptr, size_t size) __THROW { |
| 1189 | if (ptr == NULL) { |
| 1190 | ptr = do_debug_malloc_or_debug_cpp_alloc(size); |
| 1191 | MallocHook::InvokeNewHook(ptr, size); |
| 1192 | return ptr; |
| 1193 | } |
| 1194 | if (size == 0) { |
| 1195 | MallocHook::InvokeDeleteHook(ptr); |
| 1196 | DebugDeallocate(ptr, MallocBlock::kMallocType); |
| 1197 | return NULL; |
| 1198 | } |
| 1199 | MallocBlock* old = MallocBlock::FromRawPointer(ptr); |
| 1200 | old->Check(MallocBlock::kMallocType); |
| 1201 | MallocBlock* p = MallocBlock::Allocate(size, MallocBlock::kMallocType); |
| 1202 | |
| 1203 | // If realloc fails we are to leave the old block untouched and |
| 1204 | // return null |
| 1205 | if (p == NULL) return NULL; |
| 1206 | |
| 1207 | memcpy(p->data_addr(), old->data_addr(), |
| 1208 | (old->data_size() < size) ? old->data_size() : size); |
| 1209 | MallocHook::InvokeDeleteHook(ptr); |
| 1210 | MallocHook::InvokeNewHook(p->data_addr(), size); |
| 1211 | DebugDeallocate(ptr, MallocBlock::kMallocType); |
| 1212 | MALLOC_TRACE("realloc", p->data_size(), p->data_addr()); |
| 1213 | return p->data_addr(); |
| 1214 | } |
| 1215 | |
| 1216 | extern "C" PERFTOOLS_DLL_DECL void* tc_new(size_t size) { |
| 1217 | void* ptr = debug_cpp_alloc(size, MallocBlock::kNewType, false); |
nothing calls this directly
no test coverage detected