[Zope-Checkins] CVS: ZODB3/ZODB - cPickleCache.c:1.78

Jeremy Hylton jeremy@zope.com
Tue, 1 Apr 2003 13:44:25 -0500


Update of /cvs-repository/ZODB3/ZODB
In directory cvs.zope.org:/tmp/cvs-serv28749

Modified Files:
	cPickleCache.c 
Log Message:
Fix one more (last?) refcount problem with the cache.


=== ZODB3/ZODB/cPickleCache.c 1.77 => 1.78 ===
--- ZODB3/ZODB/cPickleCache.c:1.77	Tue Apr  1 11:17:50 2003
+++ ZODB3/ZODB/cPickleCache.c	Tue Apr  1 13:44:25 2003
@@ -506,7 +506,7 @@
     Py_INCREF(v);
 
     /* XXX Should we call _Py_ForgetReference() on error exit? */
-    if (PyDict_DelItem(self->data, oid) < 0)
+    if (PyDict_DelItem(self->data, oid) < 0) 
 	return -1;
     Py_DECREF((ccobject *)((cPersistentObject *)v)->cache);
 
@@ -648,6 +648,7 @@
 static int
 cc_length(ccobject *self)
 {
+    fprintf(stderr, "non_ghost_count = %d\n", self->non_ghost_count);
     return PyObject_Length(self->data);
 }
   
@@ -762,6 +763,9 @@
     
     if (PyDict_SetItem(self->data, key, v) < 0) 
 	return -1;
+    /* Remove the reference used by the dict.  The cache should only
+       have borrowed references to objects. */
+    Py_DECREF(v);
     
     p = (cPersistentObject *)v;
     Py_INCREF(self);
@@ -774,12 +778,7 @@
 	p->ring.prev =  self->ring_home.prev;
 	self->ring_home.prev->next = &p->ring;
 	self->ring_home.prev = &p->ring;
-    } else {
-	/* steal a reference from the dictionary; 
-	   ghosts have a weak reference */
-	Py_DECREF(v);
     }
-    
     return 0;
 }