Mailing List Archive

python/dist/src/Objects frameobject.c,2.60,2.61
Update of /cvsroot/python/python/dist/src/Objects
In directory usw-pr-cvs1:/tmp/cvs-serv3272/python/Objects

Modified Files:
frameobject.c
Log Message:
SF bug 543148: Memory leak with stackframes + inspect.
Put a bound on the number of frameobjects that can live in the
frameobject free_list.

Am also backporting to 2.2. I don't intend to backport to 2.1 (too
much work -- lots of cyclic structures leak there, and the GC API).


Index: frameobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/frameobject.c,v
retrieving revision 2.60
retrieving revision 2.61
diff -C2 -d -r2.60 -r2.61
*** frameobject.c 28 Mar 2002 20:34:59 -0000 2.60
--- frameobject.c 13 Apr 2002 05:21:47 -0000 2.61
***************
*** 57,63 ****
--- 57,69 ----
call depth of more than 20 or 30 is probably already exceptional
unless the program contains run-away recursion. I hope.
+
+ Later, MAXFREELIST was added to bound the # of frames saved on
+ free_list. Else programs creating lots of cyclic trash involving
+ frames could provoke free_list into growing without bound.
*/

static PyFrameObject *free_list = NULL;
+ static int numfree = 0; /* number of frames currently in free_list */
+ #define MAXFREELIST 200 /* max value for numfree */

static void
***************
*** 92,97 ****
Py_XDECREF(f->f_exc_value);
Py_XDECREF(f->f_exc_traceback);
! f->f_back = free_list;
! free_list = f;
Py_TRASHCAN_SAFE_END(f)
}
--- 98,108 ----
Py_XDECREF(f->f_exc_value);
Py_XDECREF(f->f_exc_traceback);
! if (numfree < MAXFREELIST) {
! ++numfree;
! f->f_back = free_list;
! free_list = f;
! }
! else
! PyObject_GC_Del(f);
Py_TRASHCAN_SAFE_END(f)
}
***************
*** 246,249 ****
--- 257,262 ----
}
else {
+ assert(numfree > 0);
+ --numfree;
f = free_list;
free_list = free_list->f_back;
***************
*** 476,479 ****
--- 489,494 ----
free_list = free_list->f_back;
PyObject_GC_Del(f);
+ --numfree;
}
+ assert(numfree == 0);
}