]> granicus.if.org Git - python/commitdiff
Fix a problem with Vladimir's PyFloat_Fini code: clear the free list; if
authorGuido van Rossum <guido@python.org>
Fri, 19 Mar 1999 20:59:40 +0000 (20:59 +0000)
committerGuido van Rossum <guido@python.org>
Fri, 19 Mar 1999 20:59:40 +0000 (20:59 +0000)
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

index 34fd3179f0d10de176182c729f1e546c5f188dc6..120b561a598bf28b6b60a9e569be6a1624b0f3cf 100644 (file)
@@ -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,
-                            "#   <float object at %lx, refcnt=%d, val=%s>\n",
+                            "#   <float at %lx, refcnt=%d, val=%s>\n",
                                                p, p->ob_refcnt, buf);
                                }
                        }