[Zodb-checkins] SVN: ZODB/trunk/src/ Fixed some None ref leaks in cPickleCache.c
Jim Fulton
jim at zope.com
Thu Sep 2 11:57:39 EDT 2010
Log message for revision 116146:
Fixed some None ref leaks in cPickleCache.c
Changed:
U ZODB/trunk/src/ZODB/tests/testCache.py
U ZODB/trunk/src/persistent/cPickleCache.c
U ZODB/trunk/src/persistent/tests/test_PickleCache.py
-=-
Modified: ZODB/trunk/src/ZODB/tests/testCache.py
===================================================================
--- ZODB/trunk/src/ZODB/tests/testCache.py 2010-09-02 15:51:14 UTC (rev 116145)
+++ ZODB/trunk/src/ZODB/tests/testCache.py 2010-09-02 15:57:39 UTC (rev 116146)
@@ -25,6 +25,7 @@
from ZODB.utils import p64
import doctest
import gc
+import sys
import threading
import time
import transaction
@@ -337,6 +338,8 @@
def add(key, obj):
self.cache[key] = obj
+ nones = sys.getrefcount(None)
+
key = p64(2)
# value isn't persistent
self.assertRaises(TypeError, add, key, 12)
@@ -360,6 +363,8 @@
# same object, different keys
self.assertRaises(ValueError, add, p64(0), o)
+ self.assertEqual(sys.getrefcount(None), nones)
+
def checkTwoCaches(self):
jar2 = StubDataManager()
cache2 = PickleCache(jar2)
Modified: ZODB/trunk/src/persistent/cPickleCache.c
===================================================================
--- ZODB/trunk/src/persistent/cPickleCache.c 2010-09-02 15:51:14 UTC (rev 116145)
+++ ZODB/trunk/src/persistent/cPickleCache.c 2010-09-02 15:57:39 UTC (rev 116146)
@@ -242,6 +242,8 @@
Py_DECREF(method);
if (temp == NULL)
error_occurred = 1;
+ else
+ Py_DECREF(temp);
}
here = placeholder.r_next;
@@ -354,7 +356,6 @@
{
static PyObject *_p_invalidate = NULL;
PyObject *meth, *v;
- int result;
v = PyDict_GetItem(self->data, key);
if (v == NULL)
@@ -392,9 +393,10 @@
v = PyObject_CallObject(meth, NULL);
Py_DECREF(meth);
- result = v == NULL ? -1 : 0;
+ if (v == NULL)
+ return -1;
Py_DECREF(v);
- return result;
+ return 0;
}
static PyObject *
@@ -1039,9 +1041,11 @@
return -1;
if (! PyString_Check(oid))
{
+ Py_DECREF(oid);
PyErr_Format(PyExc_TypeError,
"Cached object oid must be a string, not a %s",
oid->ob_type->tp_name);
+
return -1;
}
Modified: ZODB/trunk/src/persistent/tests/test_PickleCache.py
===================================================================
--- ZODB/trunk/src/persistent/tests/test_PickleCache.py 2010-09-02 15:51:14 UTC (rev 116145)
+++ ZODB/trunk/src/persistent/tests/test_PickleCache.py 2010-09-02 15:57:39 UTC (rev 116146)
@@ -109,7 +109,7 @@
"""
-def cache_invalidate_used_to_leak_None_ref():
+def cache_invalidate_and_minimize_used_to_leak_None_ref():
"""Persistent weak references
>>> import transaction
@@ -127,6 +127,12 @@
>>> sys.getrefcount(None) - old
0
+ >>> _ = conn.root.p.keys()
+ >>> old = sys.getrefcount(None)
+ >>> conn._cache.minimize()
+ >>> sys.getrefcount(None) - old
+ 0
+
>>> db.close()
"""
More information about the Zodb-checkins
mailing list