From d7b5fb858cce7ae7a1edd379a6ddf5d3ed3a8baf Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Fri, 19 Mar 1999 20:59:40 +0000 Subject: Fix a problem with Vladimir's PyFloat_Fini code: clear the free list; if a block cannot be freed, add its free items back to the free list. This is necessary to avoid leaking when Python is reinitialized later. --- Objects/floatobject.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/Objects/floatobject.c b/Objects/floatobject.c index 34fd317..120b561 100644 --- a/Objects/floatobject.c +++ b/Objects/floatobject.c @@ -631,11 +631,13 @@ PyFloat_Fini() fsum = 0; list = block_list; block_list = NULL; + free_list = NULL; while (list != NULL) { - p = &list->objects[0]; bc++; frem = 0; - for (i = 0; i < N_FLOATOBJECTS; i++, p++) { + for (i = 0, p = &list->objects[0]; + i < N_FLOATOBJECTS; + i++, p++) { if (PyFloat_Check(p) && p->ob_refcnt != 0) frem++; } @@ -643,6 +645,15 @@ PyFloat_Fini() if (frem) { list->next = block_list; block_list = list; + for (i = 0, p = &list->objects[0]; + i < N_FLOATOBJECTS; + i++, p++) { + if (!PyFloat_Check(p) || p->ob_refcnt == 0) { + p->ob_type = (struct _typeobject *) + free_list; + free_list = p; + } + } } else { PyMem_FREE(list); @@ -666,13 +677,14 @@ PyFloat_Fini() if (Py_VerboseFlag > 1) { list = block_list; while (list != NULL) { - p = &list->objects[0]; - for (i = 0; i < N_FLOATOBJECTS; i++, p++) { + for (i = 0, p = &list->objects[0]; + i < N_FLOATOBJECTS; + i++, p++) { if (PyFloat_Check(p) && p->ob_refcnt != 0) { char buf[100]; PyFloat_AsString(buf, p); fprintf(stderr, - "# \n", + "# \n", p, p->ob_refcnt, buf); } } -- cgit v0.12