Ignore the references to the dummy objects used as deleted keys

in dicts and sets when computing the total number of references.
This commit is contained in:
Armin Rigo 2006-04-12 17:06:05 +00:00
parent 314fce92dd
commit e170937af6
6 changed files with 40 additions and 5 deletions

View File

@ -578,6 +578,9 @@ environment the global variable trick is not safe.)
PyAPI_DATA(Py_ssize_t) _Py_RefTotal;
PyAPI_FUNC(void) _Py_NegativeRefcount(const char *fname,
int lineno, PyObject *op);
PyAPI_FUNC(PyObject *) _PyDict_Dummy(void);
PyAPI_FUNC(PyObject *) _PySet_Dummy(void);
PyAPI_FUNC(Py_ssize_t) _Py_GetRefTotal(void);
#define _Py_INC_REFTOTAL _Py_RefTotal++
#define _Py_DEC_REFTOTAL _Py_RefTotal--
#define _Py_REF_DEBUG_COMMA ,

View File

@ -115,6 +115,14 @@ equally good collision statistics, needed less code & used less memory.
/* Object used as dummy key to fill deleted entries */
static PyObject *dummy = NULL; /* Initialized by first call to newdictobject() */
#ifdef Py_REF_DEBUG
PyObject *
_PyDict_Dummy(void)
{
return dummy;
}
#endif
/* forward declarations */
static dictentry *
lookdict_string(dictobject *mp, PyObject *key, long hash);

View File

@ -5,7 +5,24 @@
#ifdef Py_REF_DEBUG
Py_ssize_t _Py_RefTotal;
#endif
Py_ssize_t
_Py_GetRefTotal(void)
{
PyObject *o;
Py_ssize_t total = _Py_RefTotal;
/* ignore the references to the dummy object of the dicts and sets
because they are not reliable and not useful (now that the
hash table code is well-tested) */
o = _PyDict_Dummy();
if (o != NULL)
total -= o->ob_refcnt;
o = _PySet_Dummy();
if (o != NULL)
total -= o->ob_refcnt;
return total;
}
#endif /* Py_REF_DEBUG */
int Py_DivisionWarningFlag;

View File

@ -16,6 +16,14 @@
/* Object used as dummy key to fill deleted entries */
static PyObject *dummy = NULL; /* Initialized by first call to make_new_set() */
#ifdef Py_REF_DEBUG
PyObject *
_PySet_Dummy(void)
{
return dummy;
}
#endif
#define INIT_NONZERO_SET_SLOTS(so) do { \
(so)->table = (so)->smalltable; \
(so)->mask = PySet_MINSIZE - 1; \

View File

@ -34,7 +34,7 @@
#else /* Py_REF_DEBUG */
#define PRINT_TOTAL_REFS() fprintf(stderr, \
"[%" PY_FORMAT_SIZE_T "d refs]\n", \
_Py_RefTotal)
_Py_GetRefTotal())
#endif
extern char *Py_GetPath(void);

View File

@ -604,10 +604,9 @@ sys_getrefcount(PyObject *self, PyObject *arg)
static PyObject *
sys_gettotalrefcount(PyObject *self)
{
return PyInt_FromSsize_t(_Py_RefTotal);
return PyInt_FromSsize_t(_Py_GetRefTotal());
}
#endif /* Py_TRACE_REFS */
#endif /* Py_REF_DEBUG */
PyDoc_STRVAR(getrefcount_doc,
"getrefcount(object) -> integer\n\