Mercurial > cpython-lru_cache-weakref
diff Objects/methodobject.c @ 45189:a4c87c889648 legacy-trunk
Limit free list of method and builtin function objects to 256 entries each.
| author | Christian Heimes <christian@cheimes.de> |
|---|---|
| date | Wed, 06 Feb 2008 12:44:34 +0000 |
| parents | a8dd8874ff2d |
| children | 920a7633ae08 |
line wrap: on
line diff
--- a/Objects/methodobject.c Wed Feb 06 01:49:00 2008 +0000 +++ b/Objects/methodobject.c Wed Feb 06 12:44:34 2008 +0000 @@ -4,7 +4,12 @@ #include "Python.h" #include "structmember.h" +/* Free list for method objects to safe malloc/free overhead + * The m_self element is used to chain the objects. + */ static PyCFunctionObject *free_list = NULL; +static int numfree = 0; +#define MAXFREELIST 256 PyObject * PyCFunction_NewEx(PyMethodDef *ml, PyObject *self, PyObject *module) @@ -14,6 +19,7 @@ if (op != NULL) { free_list = (PyCFunctionObject *)(op->m_self); PyObject_INIT(op, &PyCFunction_Type); + numfree--; } else { op = PyObject_GC_New(PyCFunctionObject, &PyCFunction_Type); @@ -125,8 +131,14 @@ _PyObject_GC_UNTRACK(m); Py_XDECREF(m->m_self); Py_XDECREF(m->m_module); - m->m_self = (PyObject *)free_list; - free_list = m; + if (numfree < MAXFREELIST) { + m->m_self = (PyObject *)free_list; + free_list = m; + numfree++; + } + else { + PyObject_GC_Del(m); + } } static PyObject * @@ -346,14 +358,16 @@ PyCFunctionObject *v = free_list; free_list = (PyCFunctionObject *)(v->m_self); PyObject_GC_Del(v); + numfree--; } + assert(numfree == 0); } /* PyCFunction_New() is now just a macro that calls PyCFunction_NewEx(), but it's part of the API so we need to keep a function around that existing C extensions can call. */ - + #undef PyCFunction_New PyAPI_FUNC(PyObject *) PyCFunction_New(PyMethodDef *, PyObject *);
