mirror of
https://github.com/python/cpython.git
synced 2024-11-28 20:33:54 +08:00
Merged revisions 78380 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk ........ r78380 | thomas.heller | 2010-02-23 21:11:44 +0100 (Di, 23 Feb 2010) | 4 lines ctypes CThunkObject was not registered correctly with the cycle garbage collector, leading to possible leaks when using callback functions. ........
This commit is contained in:
parent
b7be5703fb
commit
5117b0b0dc
@ -118,6 +118,22 @@ class Callbacks(unittest.TestCase):
|
||||
prototype = self.functype.__func__(object)
|
||||
self.assertRaises(TypeError, prototype, lambda: None)
|
||||
|
||||
def test_issue_7959(self):
|
||||
proto = self.functype.__func__(None)
|
||||
|
||||
class X(object):
|
||||
def func(self): pass
|
||||
def __init__(self):
|
||||
self.v = proto(self.func)
|
||||
|
||||
import gc
|
||||
for i in range(32):
|
||||
X()
|
||||
gc.collect()
|
||||
live = [x for x in gc.get_objects()
|
||||
if isinstance(x, X)]
|
||||
self.assertEqual(len(live), 0)
|
||||
|
||||
try:
|
||||
WINFUNCTYPE
|
||||
except NameError:
|
||||
|
@ -254,6 +254,9 @@ C-API
|
||||
Library
|
||||
-------
|
||||
|
||||
- Issue #7959: ctypes callback functions are now registered correctly
|
||||
with the cylce garbage collector.
|
||||
|
||||
- Issue #5801: removed spurious empty lines in wsgiref.
|
||||
|
||||
- Issue #6666: fix bug in trace.py that applied the list of directories
|
||||
|
@ -18,7 +18,7 @@ CThunkObject_dealloc(PyObject *_self)
|
||||
Py_XDECREF(self->restype);
|
||||
if (self->pcl)
|
||||
_ctypes_free_closure(self->pcl);
|
||||
PyObject_Del(self);
|
||||
PyObject_GC_Del(self);
|
||||
}
|
||||
|
||||
static int
|
||||
@ -61,7 +61,7 @@ PyTypeObject PyCThunk_Type = {
|
||||
0, /* tp_getattro */
|
||||
0, /* tp_setattro */
|
||||
0, /* tp_as_buffer */
|
||||
Py_TPFLAGS_DEFAULT, /* tp_flags */
|
||||
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
|
||||
"CThunkObject", /* tp_doc */
|
||||
CThunkObject_traverse, /* tp_traverse */
|
||||
CThunkObject_clear, /* tp_clear */
|
||||
@ -332,7 +332,7 @@ static CThunkObject* CThunkObject_new(Py_ssize_t nArgs)
|
||||
CThunkObject *p;
|
||||
int i;
|
||||
|
||||
p = PyObject_NewVar(CThunkObject, &PyCThunk_Type, nArgs);
|
||||
p = PyObject_GC_NewVar(CThunkObject, &PyCThunk_Type, nArgs);
|
||||
if (p == NULL) {
|
||||
PyErr_NoMemory();
|
||||
return NULL;
|
||||
@ -347,6 +347,7 @@ static CThunkObject* CThunkObject_new(Py_ssize_t nArgs)
|
||||
|
||||
for (i = 0; i < nArgs + 1; ++i)
|
||||
p->atypes[i] = NULL;
|
||||
PyObject_GC_Track((PyObject *)p);
|
||||
return p;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user