diff options
author | Christian Heimes <christian@cheimes.de> | 2008-02-06 12:44:34 (GMT) |
---|---|---|
committer | Christian Heimes <christian@cheimes.de> | 2008-02-06 12:44:34 (GMT) |
commit | 6075a82243c7646dcdd45b424cf3e5c676f31ccf (patch) | |
tree | d349099fa3b0f7fe9d5c3b364b929ffe86a1db58 /Objects | |
parent | 45eda6469124855d349666184c6f92058a9e08f0 (diff) | |
download | cpython-6075a82243c7646dcdd45b424cf3e5c676f31ccf.zip cpython-6075a82243c7646dcdd45b424cf3e5c676f31ccf.tar.gz cpython-6075a82243c7646dcdd45b424cf3e5c676f31ccf.tar.bz2 |
Limit free list of method and builtin function objects to 256 entries each.
Diffstat (limited to 'Objects')
-rw-r--r-- | Objects/classobject.c | 23 | ||||
-rw-r--r-- | Objects/methodobject.c | 20 |
2 files changed, 35 insertions, 8 deletions
diff --git a/Objects/classobject.c b/Objects/classobject.c index 9f364e2..a9e8c6a 100644 --- a/Objects/classobject.c +++ b/Objects/classobject.c @@ -4,10 +4,16 @@ #include "Python.h" #include "structmember.h" +/* Free list for method objects to safe malloc/free overhead + * The im_self element is used to chain the elements. + */ +static PyMethodObject *free_list; +static int numfree = 0; +#define MAXFREELIST 256 + #define TP_DESCR_GET(t) \ (PyType_HasFeature(t, Py_TPFLAGS_HAVE_CLASS) ? (t)->tp_descr_get : NULL) - /* Forward */ static PyObject *class_lookup(PyClassObject *, PyObject *, PyClassObject **); @@ -2193,8 +2199,6 @@ PyTypeObject PyInstance_Type = { In case (b), im_self is NULL */ -static PyMethodObject *free_list; - PyObject * PyMethod_New(PyObject *func, PyObject *self, PyObject *klass) { @@ -2207,6 +2211,7 @@ PyMethod_New(PyObject *func, PyObject *self, PyObject *klass) if (im != NULL) { free_list = (PyMethodObject *)(im->im_self); PyObject_INIT(im, &PyMethod_Type); + numfree--; } else { im = PyObject_GC_New(PyMethodObject, &PyMethod_Type); @@ -2332,8 +2337,14 @@ instancemethod_dealloc(register PyMethodObject *im) Py_DECREF(im->im_func); Py_XDECREF(im->im_self); Py_XDECREF(im->im_class); - im->im_self = (PyObject *)free_list; - free_list = im; + if (numfree < MAXFREELIST) { + im->im_self = (PyObject *)free_list; + free_list = im; + numfree++; + } + else { + PyObject_GC_Del(im); + } } static int @@ -2620,5 +2631,7 @@ PyMethod_Fini(void) PyMethodObject *im = free_list; free_list = (PyMethodObject *)(im->im_self); PyObject_GC_Del(im); + numfree--; } + assert(numfree == 0); } diff --git a/Objects/methodobject.c b/Objects/methodobject.c index 3daa9dd..17e905b 100644 --- a/Objects/methodobject.c +++ b/Objects/methodobject.c @@ -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 @@ PyCFunction_NewEx(PyMethodDef *ml, PyObject *self, PyObject *module) 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 @@ meth_dealloc(PyCFunctionObject *m) _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 @@ PyCFunction_Fini(void) 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 *); |