diff --git a/src/CHANGES.txt b/src/CHANGES.txt index 4fd10c78b904efc344ca86036d8e68038d9aeda2..9e5cefbe68805dbf7579e25077977569093eb6ef 100644 --- a/src/CHANGES.txt +++ b/src/CHANGES.txt @@ -8,6 +8,10 @@ Bugs fixed ---------- +- Changes in way that garage collection treats dictionaries in Python + 2.7 broke the object/connection cache implementation. + (https://bugs.launchpad.net/zodb/+bug/641481) + - Updated the 'repozo --kill-old-on-full' option to remove any '.index' files corresponding to backups being removed. diff --git a/src/persistent/cPickleCache.c b/src/persistent/cPickleCache.c index d0dfe9b9b5c331160b13c7ff705dfe58748bb932..8099716f0e2d9cccd6c487848a5da6d5c7dee377 100644 --- a/src/persistent/cPickleCache.c +++ b/src/persistent/cPickleCache.c @@ -767,6 +767,7 @@ cc_new_ghost(ccobject *self, PyObject *args) return NULL; if (PyDict_SetItem(self->data, key, v) < 0) return NULL; + PyObject_GC_UnTrack((void *)self->data); self->klass_count++; } else @@ -782,6 +783,7 @@ cc_new_ghost(ccobject *self, PyObject *args) if (PyDict_SetItem(self->data, key, v) < 0) return NULL; /* the dict should have a borrowed reference */ + PyObject_GC_UnTrack((void *)self->data); Py_DECREF(v); Py_INCREF(self); @@ -1098,6 +1100,7 @@ cc_add_item(ccobject *self, PyObject *key, PyObject *v) { if (PyDict_SetItem(self->data, key, v) < 0) return -1; + PyObject_GC_UnTrack((void *)self->data); self->klass_count++; return 0; } @@ -1123,6 +1126,7 @@ cc_add_item(ccobject *self, PyObject *key, PyObject *v) if (PyDict_SetItem(self->data, key, v) < 0) return -1; /* the dict should have a borrowed reference */ + PyObject_GC_UnTrack((void *)self->data); Py_DECREF(v); p = (cPersistentObject *)v;