Kaydet (Commit) 51288bce authored tarafından Guido van Rossum's avatar Guido van Rossum

Fix a problem with Vladimir's PyInt_Fini code: clear the free list; if

a block cannot be freed, add its free items back to the free list, and
add its valid ints back to the small_ints array if they are in range.
This is necessary to avoid leaking when Python is reinitialized later.
üst 8be22965
...@@ -831,11 +831,13 @@ PyInt_Fini() ...@@ -831,11 +831,13 @@ PyInt_Fini()
isum = 0; isum = 0;
list = block_list; list = block_list;
block_list = NULL; block_list = NULL;
free_list = NULL;
while (list != NULL) { while (list != NULL) {
p = &list->objects[0];
bc++; bc++;
irem = 0; irem = 0;
for (i = 0; i < N_INTOBJECTS; i++, p++) { for (i = 0, p = &list->objects[0];
i < N_INTOBJECTS;
i++, p++) {
if (PyInt_Check(p) && p->ob_refcnt != 0) if (PyInt_Check(p) && p->ob_refcnt != 0)
irem++; irem++;
} }
...@@ -843,6 +845,25 @@ PyInt_Fini() ...@@ -843,6 +845,25 @@ PyInt_Fini()
if (irem) { if (irem) {
list->next = block_list; list->next = block_list;
block_list = list; block_list = list;
for (i = 0, p = &list->objects[0];
i < N_INTOBJECTS;
i++, p++) {
if (!PyInt_Check(p) || p->ob_refcnt == 0) {
p->ob_type = (struct _typeobject *)
free_list;
free_list = p;
}
#if NSMALLNEGINTS + NSMALLPOSINTS > 0
else if (-NSMALLNEGINTS <= p->ob_ival &&
p->ob_ival < NSMALLPOSINTS &&
small_ints[p->ob_ival +
NSMALLNEGINTS] == NULL) {
Py_INCREF(p);
small_ints[p->ob_ival +
NSMALLNEGINTS] = p;
}
#endif
}
} }
else { else {
PyMem_FREE(list); PyMem_FREE(list);
...@@ -866,11 +887,12 @@ PyInt_Fini() ...@@ -866,11 +887,12 @@ PyInt_Fini()
if (Py_VerboseFlag > 1) { if (Py_VerboseFlag > 1) {
list = block_list; list = block_list;
while (list != NULL) { while (list != NULL) {
p = &list->objects[0]; for (i = 0, p = &list->objects[0];
for (i = 0; i < N_INTOBJECTS; i++, p++) { i < N_INTOBJECTS;
i++, p++) {
if (PyInt_Check(p) && p->ob_refcnt != 0) if (PyInt_Check(p) && p->ob_refcnt != 0)
fprintf(stderr, fprintf(stderr,
"# <int object at %lx, refcnt=%d, val=%ld>\n", "# <int at %lx, refcnt=%d, val=%ld>\n",
p, p->ob_refcnt, p->ob_ival); p, p->ob_refcnt, p->ob_ival);
} }
list = list->next; list = list->next;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment