I've applied both patches, however I've changed the incref part a little. Now it reads: #define Py_INCREF(op) ((op)->ob_refcnt > 0 ? (op)->ob_refcnt++ : fprintf(stderr,"Eeek! Increfing an object from refct 0 at %s:%d\n",__FILE__,__LINE__), (op)->ob_refcnt++) It's all in one line if my MUA wrapped it. I did it so as to make sure it doesn't crash in different places than it crashed before. I'll report anything I find Cheers, Leo On Thu, 2002-03-14 at 19:44, Matthew T. Kromer wrote:
Matthew T. Kromer wrote:
Attached is another diagnostic patch which you might apply to Python. If you apply this patch, you WILL need to rebuild Zope to include it.
What it will do is complain to stderr if an object is INCREF'd from refcount 0. It also silences the complaint for the one area which I know revives dead objects.
This patch will probably cause a crash after an erroneous incref-from-0 is detected, since it doesnt actually DO the incref in that case.
The intent is to find a case in the code where an object is held between threads; one thread decrefs to zero, the other thread increfs, causing a revive -- but too late to save the patient.
extensionclass also brings back the dead; the following patch to Zope's extensionclass will turn off the warning when it happens when you apply the previous patch that I sent out that complains when an object is incref'd from a refcount of zero.
-- Matt Kromer Zope Corporation http://www.zope.com/
----
Index: lib/Components/ExtensionClass/src/ExtensionClass.c =================================================================== RCS file: /cvs-repository/Zope/lib/Components/ExtensionClass/src/ExtensionClass.c,v retrieving revision 1.46.36.1 diff -u -r1.46.36.1 ExtensionClass.c --- lib/Components/ExtensionClass/src/ExtensionClass.c 4 Oct 2001 14:25:19 -0000 1.46.36.1 +++ lib/Components/ExtensionClass/src/ExtensionClass.c 14 Mar 2002 22:43:10 -0000 @@ -3047,8 +3047,9 @@ fprintf(stderr,"Deallocating a %s\n", self->ob_type->tp_name); #endif
+ self->ob_refcnt++; PyErr_Fetch(&t,&v,&tb); - Py_INCREF(self); /* Give us a new lease on life */ + /* Py_INCREF(self); /* Give us a new lease on life */
if (subclass_watcher && ! PyObject_CallMethod(subclass_watcher,"destroying","O",self)) -- Ideas don't stay in some minds very long because they don't like solitary confinement.