[Zope-Checkins] CVS: ZODB3/Persistence - cPersistence.c:1.72.8.17
Jeremy Hylton
jeremy@zope.com
Tue, 8 Jul 2003 09:54:49 -0400
Update of /cvs-repository/ZODB3/Persistence
In directory cvs.zope.org:/tmp/cvs-serv31758/Persistence
Modified Files:
Tag: zodb33-devel-branch
cPersistence.c
Log Message:
Enable GC for Persistent objects, but don't do anything in tp_clear.
XXX If we really end up with a no-op tp_clear, we don't need to have
one.
=== ZODB3/Persistence/cPersistence.c 1.72.8.16 => 1.72.8.17 ===
--- ZODB3/Persistence/cPersistence.c:1.72.8.16 Mon Jul 7 14:11:17 2003
+++ ZODB3/Persistence/cPersistence.c Tue Jul 8 09:54:43 2003
@@ -126,6 +126,7 @@
ghostify(cPersistentObject *self)
{
PyObject **dictptr;
+
/* are we already a ghost? */
if (self->state == cPersistent_GHOST_STATE)
return;
@@ -411,14 +412,13 @@
static int
Per_clear(cPersistentObject *self)
{
- /* XXX Will subtype_clear() handle the instance dict? */
- ghostify(self);
- Py_XDECREF(self->jar);
- Py_XDECREF(self->oid);
- Py_XDECREF(self->cache);
- self->jar = NULL;
- self->oid = NULL;
- self->cache = NULL;
+ /* Don't do anything!
+
+ Any cycle involving a persistent object must also involve the cache.
+ If we clear the object now, the ghostify() code will fail to remove
+ it from the cache. The cache's tp_clear slot will ghostify this
+ object, so that should be safe.
+ */
return 0;
}
@@ -595,7 +595,7 @@
{
int deactivate = 0, true;
if (!v) {
- /* delattr is used to invalidate an object *even* if it has changed. */
+ /* delattr is used to invalidate an object even if it has changed. */
if (self->state != cPersistent_GHOST_STATE)
self->state = cPersistent_UPTODATE_STATE;
deactivate = 1;
@@ -790,7 +790,7 @@
(getattrofunc)Per_getattro, /* tp_getattro */
(setattrofunc)Per_setattro, /* tp_setattro */
0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
/* tp_flags */
0, /* tp_doc */
(traverseproc)Per_traverse, /* tp_traverse */
@@ -800,7 +800,7 @@
0, /* tp_iter */
0, /* tp_iternext */
Per_methods, /* tp_methods */
- 0, /* tp_members */
+ 0, /* tp_members */
Per_getsets, /* tp_getset */
};