Mercurial > cpython-lru_cache-weakref
diff Objects/floatobject.c @ 47897:0738119c1ef8 legacy-trunk
- Issue #2862: Make int and float freelist management consistent with other
freelists. Changes their CompactFreeList apis into ClearFreeList apis and
calls them via gc.collect().
| author | Gregory P. Smith <greg@mad-scientist.com> |
|---|---|
| date | Sun, 06 Jul 2008 03:35:58 +0000 |
| parents | 4bf84035cb5f |
| children | 97ba936e8df8 |
line wrap: on
line diff
--- a/Objects/floatobject.c Sat Jul 05 20:39:59 2008 +0000 +++ b/Objects/floatobject.c Sun Jul 06 03:35:58 2008 +0000 @@ -1608,30 +1608,28 @@ PyStructSequence_InitType(&FloatInfoType, &floatinfo_desc); } -void -PyFloat_CompactFreeList(size_t *pbc, size_t *pbf, size_t *bsum) +int +PyFloat_ClearFreeList(void) { PyFloatObject *p; PyFloatBlock *list, *next; - unsigned i; - size_t bc = 0, bf = 0; /* block count, number of freed blocks */ - size_t fsum = 0; /* total unfreed ints */ - int frem; /* remaining unfreed ints per block */ + int i; + int u; /* remaining unfreed ints per block */ + int freelist_size = 0; list = block_list; block_list = NULL; free_list = NULL; while (list != NULL) { - bc++; - frem = 0; + u = 0; for (i = 0, p = &list->objects[0]; i < N_FLOATOBJECTS; i++, p++) { if (PyFloat_CheckExact(p) && Py_REFCNT(p) != 0) - frem++; + u++; } next = list->next; - if (frem) { + if (u) { list->next = block_list; block_list = list; for (i = 0, p = &list->objects[0]; @@ -1646,15 +1644,12 @@ } } else { - PyMem_FREE(list); /* XXX PyObject_FREE ??? */ - bf++; + PyMem_FREE(list); } - fsum += frem; + freelist_size += u; list = next; } - *pbc = bc; - *pbf = bf; - *bsum = fsum; + return freelist_size; } void @@ -1662,25 +1657,21 @@ { PyFloatObject *p; PyFloatBlock *list; - unsigned i; - size_t bc, bf; /* block count, number of freed blocks */ - size_t fsum; /* total unfreed floats per block */ + int i; + int u; /* total unfreed floats per block */ - PyFloat_CompactFreeList(&bc, &bf, &fsum); + u = PyFloat_ClearFreeList(); if (!Py_VerboseFlag) return; fprintf(stderr, "# cleanup floats"); - if (!fsum) { + if (!u) { fprintf(stderr, "\n"); } else { fprintf(stderr, - ": %" PY_FORMAT_SIZE_T "d unfreed float%s in %" - PY_FORMAT_SIZE_T "d out of %" - PY_FORMAT_SIZE_T "d block%s\n", - fsum, fsum == 1 ? "" : "s", - bc - bf, bc, bc == 1 ? "" : "s"); + ": %d unfreed float%s\n", + u, u == 1 ? "" : "s"); } if (Py_VerboseFlag > 1) { list = block_list;
