summaryrefslogtreecommitdiffstats
path: root/Objects/obmalloc.c
diff options
context:
space:
mode:
authorNeal Norwitz <nnorwitz@gmail.com>2004-06-06 19:20:22 (GMT)
committerNeal Norwitz <nnorwitz@gmail.com>2004-06-06 19:20:22 (GMT)
commit7eb3c9196da5be52a670d6d8dd24939a3c27b594 (patch)
tree36839f171ac8368c7b04926e69dccb58cd2adb88 /Objects/obmalloc.c
parent0b4d1ee29de61c13aa71ac907037213652d64172 (diff)
downloadcpython-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.c43
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