This source file includes following definitions.
- TestNewHook
- TestDeleteHook
- TestMallocHook
- TestMallocExtension
- main
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <gperftools/malloc_extension_c.h>
#include <gperftools/malloc_hook_c.h>
#define FAIL(msg) do { \
fprintf(stderr, "FATAL ERROR: %s\n", msg); \
exit(1); \
} while (0)
static int g_new_hook_calls = 0;
static int g_delete_hook_calls = 0;
void TestNewHook(const void* ptr, size_t size) {
g_new_hook_calls++;
}
void TestDeleteHook(const void* ptr) {
g_delete_hook_calls++;
}
void TestMallocHook(void) {
#if 0
void* result[5];
if (MallocHook_GetCallerStackTrace(result, sizeof(result)/sizeof(*result),
0) < 2) {
FAIL("GetCallerStackTrace failed");
}
#endif
if (!MallocHook_AddNewHook(&TestNewHook)) {
FAIL("Failed to add new hook");
}
if (!MallocHook_AddDeleteHook(&TestDeleteHook)) {
FAIL("Failed to add delete hook");
}
free(malloc(10));
free(malloc(20));
if (g_new_hook_calls != 2) {
FAIL("Wrong number of calls to the new hook");
}
if (g_delete_hook_calls != 2) {
FAIL("Wrong number of calls to the delete hook");
}
if (!MallocHook_RemoveNewHook(&TestNewHook)) {
FAIL("Failed to remove new hook");
}
if (!MallocHook_RemoveDeleteHook(&TestDeleteHook)) {
FAIL("Failed to remove delete hook");
}
}
void TestMallocExtension(void) {
int blocks;
size_t total;
int hist[64];
char buffer[200];
char* x = (char*)malloc(10);
MallocExtension_VerifyAllMemory();
MallocExtension_VerifyMallocMemory(x);
MallocExtension_MallocMemoryStats(&blocks, &total, hist);
MallocExtension_GetStats(buffer, sizeof(buffer));
if (!MallocExtension_GetNumericProperty("generic.current_allocated_bytes",
&total)) {
FAIL("GetNumericProperty failed for generic.current_allocated_bytes");
}
if (total < 10) {
FAIL("GetNumericProperty had bad return for generic.current_allocated_bytes");
}
if (!MallocExtension_GetNumericProperty("generic.current_allocated_bytes",
&total)) {
FAIL("GetNumericProperty failed for generic.current_allocated_bytes");
}
MallocExtension_MarkThreadIdle();
MallocExtension_MarkThreadBusy();
MallocExtension_ReleaseToSystem(1);
MallocExtension_ReleaseFreeMemory();
if (MallocExtension_GetEstimatedAllocatedSize(10) < 10) {
FAIL("GetEstimatedAllocatedSize returned a bad value (too small)");
}
if (MallocExtension_GetAllocatedSize(x) < 10) {
FAIL("GetEstimatedAllocatedSize returned a bad value (too small)");
}
if (MallocExtension_GetOwnership(x) != MallocExtension_kOwned) {
FAIL("DidAllocatePtr returned a bad value (kNotOwned)");
}
if (MallocExtension_GetOwnership(hist) != MallocExtension_kNotOwned) {
FAIL("DidAllocatePtr returned a bad value (kOwned)");
}
free(x);
}
int main(int argc, char** argv) {
TestMallocHook();
TestMallocExtension();
printf("PASS\n");
return 0;
}