mem: improve debugging

This commit is contained in:
Thomas Schoebel-Theuer 2013-01-21 16:15:33 +01:00
parent d02814e9c5
commit 229092c28c
1 changed files with 10 additions and 4 deletions

View File

@ -396,12 +396,14 @@ void *_get_free(int order)
if (likely(data)) { if (likely(data)) {
void *next = *(void**)data; void *next = *(void**)data;
#ifdef BRICK_DEBUG_MEM // check for corruptions #ifdef BRICK_DEBUG_MEM // check for corruptions
void *copy = *(((void**)data)+1); long pattern = *(((long*)data)+1);
if (unlikely(next != copy)) { // found a corruption void *copy = *(((void**)data)+2);
if (unlikely(pattern != 0xf0f0f0f0f0f0f0f0 || next != copy)) { // found a corruption
// prevent further trouble by leaving a memleak // prevent further trouble by leaving a memleak
brick_freelist[order] = NULL; brick_freelist[order] = NULL;
traced_unlock(&freelist_lock[order], flags); traced_unlock(&freelist_lock[order], flags);
BRICK_ERR("freelist corruption at %p (next %p != %p, murdered = %d), order = %d\n", data, next, copy, atomic_read(&freelist_count[order]), order); BRICK_ERR("freelist corruption at %p (pattern = %lx next %p != %p, murdered = %d), order = %d\n",
data, pattern, next, copy, atomic_read(&freelist_count[order]), order);
return NULL; return NULL;
} }
#endif #endif
@ -418,11 +420,15 @@ void _put_free(void *data, int order)
void *next; void *next;
unsigned long flags; unsigned long flags;
#ifdef BRICK_DEBUG_MEM // fill with pattern
memset(data, 0xf0, PAGE_SIZE << order);
#endif
traced_lock(&freelist_lock[order], flags); traced_lock(&freelist_lock[order], flags);
next = brick_freelist[order]; next = brick_freelist[order];
*(void**)data = next; *(void**)data = next;
#ifdef BRICK_DEBUG_MEM // insert redundant copy for checking #ifdef BRICK_DEBUG_MEM // insert redundant copy for checking
*(((void**)data)+1) = next; *(((void**)data)+2) = next;
#endif #endif
brick_freelist[order] = data; brick_freelist[order] = data;
traced_unlock(&freelist_lock[order], flags); traced_unlock(&freelist_lock[order], flags);