* Adding malloc_debug.h that exposes the malloc_debug API.

* Moving some functions around, removing and adding others for the public API.

I've written a blog post at haiku-os.org to go as documentation for this
introducing the API and the other helpful bits.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35431 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Michael Lotz 2010-02-08 01:27:21 +00:00
parent 7438e94206
commit f6a6245c89
2 changed files with 74 additions and 20 deletions

View File

@ -0,0 +1,26 @@
/*
* Copyright 2010, Haiku Inc. All Rights Reserved.
* Distributed under the terms of the MIT License.
*/
#ifndef MALLOC_DEBUG_H
#define MALLOC_DEBUG_H
#ifdef __cplusplus
extern "C" {
#endif
extern status_t heap_debug_start_wall_checking(int msInterval);
extern status_t heap_debug_stop_wall_checking();
extern void heap_debug_set_paranoid_validation(bool enabled);
extern void heap_debug_validate_heaps();
extern void heap_debug_validate_walls();
extern void heap_debug_dump_allocations(bool statsOnly, thread_id thread);
extern void heap_debug_dump_heaps(bool dumpAreas, bool dumpBins);
#ifdef __cplusplus
}
#endif
#endif /* MALLOC_DEBUG_H */

View File

@ -246,15 +246,7 @@ dump_allocator(heap_allocator *heap, bool areas, bool bins)
}
void
dump_heap_list(int argc, char **argv)
{
for (uint32 i = 0; i < HEAP_CLASS_COUNT; i++)
dump_allocator(sHeaps[i], true, true);
}
void
static void
dump_allocations(bool statsOnly, thread_id thread)
{
size_t totalSize = 0;
@ -346,7 +338,7 @@ dump_allocations(bool statsOnly, thread_id thread)
}
void
static void
heap_validate_walls()
{
for (uint32 classIndex = 0; classIndex < HEAP_CLASS_COUNT; classIndex++) {
@ -1503,21 +1495,25 @@ heap_create_new_heap_area(heap_allocator *heap, const char *name, size_t size)
static int32
heap_wall_checker(void *data)
{
int msInterval = (int32)data;
while (!sStopWallChecking) {
heap_validate_walls();
snooze(1 * 1000 * 1000);
snooze(msInterval * 1000);
}
return 0;
}
// #pragma mark - Heap Debug API
extern "C" status_t
heap_debug_start_wall_checking()
heap_debug_start_wall_checking(int msInterval)
{
if (sWallCheckThread < 0) {
sWallCheckThread = spawn_thread(heap_wall_checker, "heap wall checker",
B_LOW_PRIORITY, NULL);
B_LOW_PRIORITY, (void *)msInterval);
}
if (sWallCheckThread < 0)
@ -1537,23 +1533,46 @@ heap_debug_stop_wall_checking()
}
extern "C" status_t
extern "C" void
heap_debug_set_paranoid_validation(bool enabled)
{
sParanoidValidation = enabled;
return B_OK;
}
extern "C" void *
sbrk_hook(long)
extern "C" void
heap_debug_validate_heaps()
{
debug_printf("sbrk not supported on malloc debug\n");
panic("sbrk not supported on malloc debug\n");
return NULL;
for (uint32 i = 0; i < HEAP_CLASS_COUNT; i++)
heap_validate_heap(sHeaps[i]);
}
extern "C" void
heap_debug_validate_walls()
{
heap_validate_walls();
}
extern "C" void
heap_debug_dump_allocations(bool statsOnly, thread_id thread)
{
dump_allocations(statsOnly, thread);
}
extern "C" void
heap_debug_dump_heaps(bool dumpAreas, bool dumpBins)
{
for (uint32 i = 0; i < HEAP_CLASS_COUNT; i++)
dump_allocator(sHeaps[i], dumpAreas, dumpBins);
}
// #pragma mark - Init
extern "C" status_t
__init_heap(void)
{
@ -1586,6 +1605,15 @@ __init_heap(void)
// #pragma mark - Public API
extern "C" void *
sbrk_hook(long)
{
debug_printf("sbrk not supported on malloc debug\n");
panic("sbrk not supported on malloc debug\n");
return NULL;
}
void *
memalign(size_t alignment, size_t size)
{