Added optional kernel tracing for the userland memory allocator.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24356 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -23,5 +23,6 @@
|
|||||||
//#define SIGNAL_TRACING
|
//#define SIGNAL_TRACING
|
||||||
//#define SYSCALL_TRACING
|
//#define SYSCALL_TRACING
|
||||||
//#define TEAM_TRACING
|
//#define TEAM_TRACING
|
||||||
|
//#define USER_MALLOC_TRACING
|
||||||
|
|
||||||
#endif // KERNEL_TRACING_CONFIG_H
|
#endif // KERNEL_TRACING_CONFIG_H
|
||||||
|
|||||||
@@ -24,6 +24,8 @@
|
|||||||
#include "processheap.h"
|
#include "processheap.h"
|
||||||
#include "arch-specific.h"
|
#include "arch-specific.h"
|
||||||
|
|
||||||
|
#include <tracing_config.h>
|
||||||
|
|
||||||
#include <image.h>
|
#include <image.h>
|
||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
@@ -32,6 +34,13 @@
|
|||||||
using namespace BPrivate;
|
using namespace BPrivate;
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef USER_MALLOC_TRACING
|
||||||
|
# define KTRACE(format...) ktrace_printf(format)
|
||||||
|
#else
|
||||||
|
# define KTRACE(format...) do {} while (false)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#if HEAP_LEAK_CHECK
|
#if HEAP_LEAK_CHECK
|
||||||
static block* sUsedList = NULL;
|
static block* sUsedList = NULL;
|
||||||
static hoardLockType sUsedLock = 0;
|
static hoardLockType sUsedLock = 0;
|
||||||
@@ -259,6 +268,7 @@ malloc(size_t size)
|
|||||||
void *addr = pHeap->getHeap(pHeap->getHeapIndex()).malloc(size);
|
void *addr = pHeap->getHeap(pHeap->getHeapIndex()).malloc(size);
|
||||||
if (addr == NULL) {
|
if (addr == NULL) {
|
||||||
errno = B_NO_MEMORY;
|
errno = B_NO_MEMORY;
|
||||||
|
KTRACE("malloc(%lu) -> NULL", size);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -269,6 +279,8 @@ malloc(size_t size)
|
|||||||
addr = set_wall(addr, size);
|
addr = set_wall(addr, size);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
KTRACE("malloc(%lu) -> %p", size, addr);
|
||||||
|
|
||||||
return addr;
|
return addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -286,6 +298,7 @@ calloc(size_t nelem, size_t elsize)
|
|||||||
void *ptr = pHeap->getHeap(pHeap->getHeapIndex()).malloc(size);
|
void *ptr = pHeap->getHeap(pHeap->getHeapIndex()).malloc(size);
|
||||||
if (ptr == NULL) {
|
if (ptr == NULL) {
|
||||||
errno = B_NO_MEMORY;
|
errno = B_NO_MEMORY;
|
||||||
|
KTRACE("calloc(%lu, %lu) -> NULL", nelem, elsize);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -299,6 +312,7 @@ calloc(size_t nelem, size_t elsize)
|
|||||||
|
|
||||||
// Zero out the malloc'd block.
|
// Zero out the malloc'd block.
|
||||||
memset(ptr, 0, size);
|
memset(ptr, 0, size);
|
||||||
|
KTRACE("calloc(%lu, %lu) -> %p", nelem, elsize, ptr);
|
||||||
return ptr;
|
return ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -310,6 +324,7 @@ free(void *ptr)
|
|||||||
#if HEAP_WALL
|
#if HEAP_WALL
|
||||||
if (ptr == NULL)
|
if (ptr == NULL)
|
||||||
return;
|
return;
|
||||||
|
KTRACE("free(%p)", ptr);
|
||||||
ptr = check_wall((uint8*)ptr);
|
ptr = check_wall((uint8*)ptr);
|
||||||
#endif
|
#endif
|
||||||
#if HEAP_LEAK_CHECK
|
#if HEAP_LEAK_CHECK
|
||||||
@@ -333,6 +348,7 @@ memalign(size_t alignment, size_t size)
|
|||||||
size);
|
size);
|
||||||
if (addr == NULL) {
|
if (addr == NULL) {
|
||||||
errno = B_NO_MEMORY;
|
errno = B_NO_MEMORY;
|
||||||
|
KTRACE("memalign(%lu, %lu) -> NULL", alignment, size);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -340,6 +356,7 @@ memalign(size_t alignment, size_t size)
|
|||||||
add_address(addr, size);
|
add_address(addr, size);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
KTRACE("memalign(%lu, %lu) -> %p", alignment, size, addr);
|
||||||
return addr;
|
return addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -357,15 +374,20 @@ posix_memalign(void **_pointer, size_t alignment, size_t size)
|
|||||||
static processHeap *pHeap = getAllocator();
|
static processHeap *pHeap = getAllocator();
|
||||||
void *pointer = pHeap->getHeap(pHeap->getHeapIndex()).memalign(alignment,
|
void *pointer = pHeap->getHeap(pHeap->getHeapIndex()).memalign(alignment,
|
||||||
size);
|
size);
|
||||||
if (pointer == NULL)
|
if (pointer == NULL) {
|
||||||
|
KTRACE("posix_memalign(%p, %lu, %lu) -> NULL", _pointer, alignment,
|
||||||
|
size);
|
||||||
return B_NO_MEMORY;
|
return B_NO_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
#if HEAP_LEAK_CHECK
|
#if HEAP_LEAK_CHECK
|
||||||
add_address(pointer, size);
|
add_address(pointer, size);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
*_pointer = pointer;
|
*_pointer = pointer;
|
||||||
return 0;
|
KTRACE("posix_memalign(%p, %lu, %lu) -> %p", _pointer, alignment, size,
|
||||||
|
pointer);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -401,6 +423,7 @@ realloc(void *ptr, size_t size)
|
|||||||
check_wall((uint8*)ptr + HEAP_WALL_SIZE);
|
check_wall((uint8*)ptr + HEAP_WALL_SIZE);
|
||||||
ptr = set_wall(ptr, size);
|
ptr = set_wall(ptr, size);
|
||||||
#endif
|
#endif
|
||||||
|
KTRACE("realloc(%p, %lu) -> %p", ptr, size, ptr);
|
||||||
return ptr;
|
return ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -415,6 +438,7 @@ realloc(void *ptr, size_t size)
|
|||||||
if (buffer == NULL) {
|
if (buffer == NULL) {
|
||||||
// Allocation failed, leave old block and return
|
// Allocation failed, leave old block and return
|
||||||
errno = B_NO_MEMORY;
|
errno = B_NO_MEMORY;
|
||||||
|
KTRACE("realloc(%p, %lu) -> NULL", ptr, size);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -428,6 +452,7 @@ realloc(void *ptr, size_t size)
|
|||||||
free(ptr);
|
free(ptr);
|
||||||
|
|
||||||
// Return a pointer to the new one.
|
// Return a pointer to the new one.
|
||||||
|
KTRACE("realloc(%p, %lu) -> %p", ptr, size, buffer);
|
||||||
return buffer;
|
return buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user