On Mon, Dec 31, 2012 at 5:42 PM, Nils Bruin <nbr...@sfu.ca> wrote: > On Dec 31, 5:35 pm, Robert Bradshaw <rober...@math.washington.edu> > wrote: > > Yeah, sticking an untrack there certainly seems safe. It looks > > like PyObject_GC_UnTrack is idempotent, so we don't have to track it > before > > going up the dealloc stack. If this fixes it, I sense another Cython > > release around the corner... > > Not quite ...
Ah, yes, the base object uses the (non-idempotent) macro rather than the function. It almost seems like this should be done by the Python framework rather than requiring each class to know about. > Quoting from Objects/typeobject.h:1034 > > Q. Why do we GC-untrack before the trashcan and then > immediately > GC-track again afterward? > > A. In the case that the base class is GC-aware, the base class > probably GC-untracks the object. If it does that using > the > UNTRACK macro, this will crash when the object is already > untracked. Because we don't know what the base class does, > the > only safe thing is to make sure the object is tracked when > we > call the base class dealloc. But... The trashcan begin > macro > requires that the object is *untracked* before it is > called. So > the dance becomes: > > GC untrack > trashcan begin > GC track > > Q. Why did the last question say "immediately GC-track again"? > It's nowhere near immediately. > > A. Because the code *used* to re-track immediately. Bad > Idea. > self has a refcount of 0, and if gc ever gets its hands on > it > (which can happen if any weakref callback gets invoked), it > looks like trash to gc too, and gc also tries to delete self > then. But we're already deleting self. Double deallocation > is > a subtle disaster. > > Incidentally, it may be worthwhile to read up on this trashcan > mechanism. It looks like something cython objects might want to > participate in as well. It should help in keeping the stack shallow > during recursive deallocation calls. Yeah, I just learned about that in this thread. Interesting idea. - Robert -- You received this message because you are subscribed to the Google Groups "sage-devel" group. To post to this group, send email to sage-devel@googlegroups.com. To unsubscribe from this group, send email to sage-devel+unsubscr...@googlegroups.com. Visit this group at http://groups.google.com/group/sage-devel?hl=en.