Merged revisions 78382 via svnmerge from

svn+ssh://pythondev@svn.python.org/python/branches/py3k

................
  r78382 | thomas.heller | 2010-02-23 21:25:02 +0100 (Di, 23 Feb 2010) | 11 lines

  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:
Thomas Heller 2010-02-23 20:32:43 +00:00
parent f99f67be01
commit 41c5d2fb56
3 changed files with 23 additions and 3 deletions

View File

@ -118,6 +118,22 @@ def test_unsupported_restype_2(self):
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:

View File

@ -86,6 +86,9 @@ Core and Builtins
Library
-------
- Issue #7959: ctypes callback functions are now registered correctly
with the cylce garbage collector.
- Issue #6666: fix bug in trace.py that applied the list of directories
to be ignored only to the first file. Noted by Bogdan Opanchuk.

View File

@ -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 */
@ -364,7 +364,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;
@ -379,6 +379,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;
}