diff options
author | Neal Norwitz <nnorwitz@gmail.com> | 2004-06-06 19:20:22 (GMT) |
---|---|---|
committer | Neal Norwitz <nnorwitz@gmail.com> | 2004-06-06 19:20:22 (GMT) |
commit | 7eb3c9196da5be52a670d6d8dd24939a3c27b594 (patch) | |
tree | 36839f171ac8368c7b04926e69dccb58cd2adb88 /Objects/obmalloc.c | |
parent | 0b4d1ee29de61c13aa71ac907037213652d64172 (diff) | |
download | cpython-7eb3c9196da5be52a670d6d8dd24939a3c27b594.zip cpython-7eb3c9196da5be52a670d6d8dd24939a3c27b594.tar.gz cpython-7eb3c9196da5be52a670d6d8dd24939a3c27b594.tar.bz2 |
SF bug 881641, make it easier to use valgrind
Diffstat (limited to 'Objects/obmalloc.c')
-rw-r--r-- | Objects/obmalloc.c | 43 |
1 files changed, 39 insertions, 4 deletions
diff --git a/Objects/obmalloc.c b/Objects/obmalloc.c index 7e5fd4a..54173e7 100644 --- a/Objects/obmalloc.c +++ b/Objects/obmalloc.c @@ -534,8 +534,32 @@ error: * so the (I) < narenas must be false, saving us from trying to index into * a NULL arenas. */ -#define ADDRESS_IN_RANGE(P, I) \ - ((I) < narenas && (uptr)(P) - arenas[I] < (uptr)ARENA_SIZE) +#define Py_ADDRESS_IN_RANGE(P, POOL) \ + ((POOL)->arenaindex < narenas && \ + (uptr)(P) - arenas[(POOL)->arenaindex] < (uptr)ARENA_SIZE) + +/* This is only useful when running memory debuggers such as + * Purify or Valgrind. Uncomment to use. + * + */ +#define Py_USING_MEMORY_DEBUGGER + +#ifdef Py_USING_MEMORY_DEBUGGER + +/* Py_ADDRESS_IN_RANGE may access uninitialized memory by design + * This leads to thousands of spurious warnings when using + * Purify or Valgrind. By making a function, we can easily + * suppress the uninitialized memory reads in this one function. + * So we won't ignore real errors elsewhere. + * + * Disable the macro and use a function. + */ + +#undef Py_ADDRESS_IN_RANGE + +/* Don't make static, to ensure this isn't inlined. */ +int Py_ADDRESS_IN_RANGE(void *P, poolp pool); +#endif /*==========================================================================*/ @@ -708,7 +732,7 @@ PyObject_Free(void *p) return; pool = POOL_ADDR(p); - if (ADDRESS_IN_RANGE(p, pool->arenaindex)) { + if (Py_ADDRESS_IN_RANGE(p, pool)) { /* We allocated this address. */ LOCK(); /* @@ -791,7 +815,7 @@ PyObject_Realloc(void *p, size_t nbytes) return PyObject_Malloc(nbytes); pool = POOL_ADDR(p); - if (ADDRESS_IN_RANGE(p, pool->arenaindex)) { + if (Py_ADDRESS_IN_RANGE(p, pool)) { /* We're in charge of this block */ size = INDEX2SIZE(pool->szidx); if (nbytes <= size) { @@ -1373,3 +1397,14 @@ _PyObject_DebugMallocStats(void) } #endif /* PYMALLOC_DEBUG */ + +#ifdef Py_USING_MEMORY_DEBUGGER +/* Make this function last so gcc won't inline it + since the definition is after the reference. */ +int +Py_ADDRESS_IN_RANGE(void *P, poolp pool) +{ + return ((pool->arenaindex) < narenas && + (uptr)(P) - arenas[pool->arenaindex] < (uptr)ARENA_SIZE); +} +#endif |