Kaydet (Commit) d517d084 authored tarafından Thomas Heller's avatar Thomas Heller

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.
........
üst c9081b39
...@@ -118,6 +118,22 @@ class Callbacks(unittest.TestCase): ...@@ -118,6 +118,22 @@ class Callbacks(unittest.TestCase):
prototype = self.functype.im_func(object) prototype = self.functype.im_func(object)
self.assertRaises(TypeError, prototype, lambda: None) self.assertRaises(TypeError, prototype, lambda: None)
def test_issue_7959(self):
proto = self.functype.im_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.failUnlessEqual(len(live), 0)
try: try:
WINFUNCTYPE WINFUNCTYPE
except NameError: except NameError:
......
...@@ -66,6 +66,9 @@ Core and Builtins ...@@ -66,6 +66,9 @@ Core and Builtins
Library Library
------- -------
- Issue #7959: ctypes callback functions are now registered correctly
with the cylce garbage collector.
- Issue #6243: curses.getkey() can segfault when used with ungetch. - Issue #6243: curses.getkey() can segfault when used with ungetch.
Fix by Trundle and Jerry Chen. Fix by Trundle and Jerry Chen.
......
...@@ -23,7 +23,7 @@ CThunkObject_dealloc(PyObject *_self) ...@@ -23,7 +23,7 @@ CThunkObject_dealloc(PyObject *_self)
Py_XDECREF(self->restype); Py_XDECREF(self->restype);
if (self->pcl) if (self->pcl)
FreeClosure(self->pcl); FreeClosure(self->pcl);
PyObject_Del(self); PyObject_GC_Del(self);
} }
static int static int
...@@ -66,7 +66,7 @@ PyTypeObject CThunk_Type = { ...@@ -66,7 +66,7 @@ PyTypeObject CThunk_Type = {
0, /* tp_getattro */ 0, /* tp_getattro */
0, /* tp_setattro */ 0, /* tp_setattro */
0, /* tp_as_buffer */ 0, /* tp_as_buffer */
Py_TPFLAGS_DEFAULT, /* tp_flags */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
"CThunkObject", /* tp_doc */ "CThunkObject", /* tp_doc */
CThunkObject_traverse, /* tp_traverse */ CThunkObject_traverse, /* tp_traverse */
CThunkObject_clear, /* tp_clear */ CThunkObject_clear, /* tp_clear */
...@@ -367,7 +367,7 @@ static CThunkObject* CThunkObject_new(Py_ssize_t nArgs) ...@@ -367,7 +367,7 @@ static CThunkObject* CThunkObject_new(Py_ssize_t nArgs)
CThunkObject *p; CThunkObject *p;
int i; int i;
p = PyObject_NewVar(CThunkObject, &CThunk_Type, nArgs); p = PyObject_GC_NewVar(CThunkObject, &CThunk_Type, nArgs);
if (p == NULL) { if (p == NULL) {
PyErr_NoMemory(); PyErr_NoMemory();
return NULL; return NULL;
...@@ -382,6 +382,7 @@ static CThunkObject* CThunkObject_new(Py_ssize_t nArgs) ...@@ -382,6 +382,7 @@ static CThunkObject* CThunkObject_new(Py_ssize_t nArgs)
for (i = 0; i < nArgs + 1; ++i) for (i = 0; i < nArgs + 1; ++i)
p->atypes[i] = NULL; p->atypes[i] = NULL;
PyObject_GC_Track((PyObject *)p);
return p; return p;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment