[Python-checkins] python/dist/src/Objects obmalloc.c,2.42,2.43

tim_one@sourceforge.net tim_one@sourceforge.net
Thu, 18 Apr 2002 15:25:05 -0700


Update of /cvsroot/python/python/dist/src/Objects
In directory usw-pr-cvs1:/tmp/cvs-serv31559/python/Objects

Modified Files:
	obmalloc.c 
Log Message:
_PyObject_DebugMallocStats():  Added some potentially expensive internal
consistency checks, enabled only in a debug (Py_DEBUG) build.  Note that
this never gets called automatically unless PYMALLOC_DEBUG is #define'd
too, and the envar PYTHONMALLOCSTATS exists.


Index: obmalloc.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/obmalloc.c,v
retrieving revision 2.42
retrieving revision 2.43
diff -C2 -d -r2.42 -r2.43
*** obmalloc.c	18 Apr 2002 21:58:56 -0000	2.42
--- obmalloc.c	18 Apr 2002 22:25:03 -0000	2.43
***************
*** 909,912 ****
--- 909,937 ----
  }
  
+ #ifdef Py_DEBUG
+ /* Is target in the list?  The list is traversed via the nextpool pointers.
+  * The list may be NULL-terminated, or circular.  Return 1 if target is in
+  * list, else 0.
+  */
+ static int
+ pool_is_in_list(const poolp target, poolp list)
+ {
+ 	poolp origlist = list;
+ 	assert(target != NULL);
+ 	if (list == NULL)
+ 		return 0;
+ 	do {
+ 		if (target == list)
+ 			return 1;
+ 		list = list->nextpool;
+ 	} while (list != NULL && list != origlist);
+ 	return 0;
+ }
+ 
+ #else
+ #define pool_is_in_list(X, Y) 1
+ 
+ #endif	/* Py_DEBUG */
+ 
  /* The debug malloc asks for 16 extra bytes and fills them with useful stuff,
     here calling the underlying malloc's result p:
***************
*** 1201,1205 ****
  }
  
! /* Print summary info to stderr about the state of pymalloc's structures. */
  void
  _PyObject_DebugMallocStats(void)
--- 1226,1233 ----
  }
  
! /* Print summary info to stderr about the state of pymalloc's structures.
!  * In Py_DEBUG mode, also perform some expensive internal consistency
!  * checks.
!  */
  void
  _PyObject_DebugMallocStats(void)
***************
*** 1263,1275 ****
  		for (j = 0; j < poolsinarena; ++j, base += POOL_SIZE) {
  			poolp p = (poolp)base;
  			if (p->ref.count == 0) {
  				/* currently unused */
  				++numfreepools;
  				continue;
  			}
! 			++numpools[p->szidx];
! 			numblocks[p->szidx] += p->ref.count;
! 			numfreeblocks[p->szidx] += NUMBLOCKS(p->szidx) -
! 						   p->ref.count;
  		}
  	}
--- 1291,1311 ----
  		for (j = 0; j < poolsinarena; ++j, base += POOL_SIZE) {
  			poolp p = (poolp)base;
+ 			const uint sz = p->szidx;
+ 			uint freeblocks;
+ 
  			if (p->ref.count == 0) {
  				/* currently unused */
  				++numfreepools;
+ 				assert(pool_is_in_list(p, freepools));
  				continue;
  			}
! 			++numpools[sz];
! 			numblocks[sz] += p->ref.count;
! 			freeblocks = NUMBLOCKS(sz) - p->ref.count;
! 			numfreeblocks[sz] += freeblocks;
! #ifdef Py_DEBUG
! 			if (freeblocks > 0)
! 				assert(pool_is_in_list(p, usedpools[sz + sz]));
! #endif
  		}
  	}