-
-
Notifications
You must be signed in to change notification settings - Fork 674
Description
Ref counting for Singular rings
Python makes no guarantees that destructors are called if circular references are involved. This patch implements an extra Python proxy layer that correctly refcounts Singular rings. In contrast to our earlier code, it will release the singular rings once they are no longer in use. This triggers various issues in Sage/libSingular that are dealt with in the follow-up ticket #10903
Historic discussion
As described for the Sage on Gentoo project, there is a problem in how parts of sage use __deallocate__
in their Cython code. I've actually traced an instance of groebner_strategy.pyx causing segmentation faults under Python 2.7.
What happens is that the garbage collector invokes the tp_clear function for the object. Its implementation is provided by Cython, and one of its effects is that every python reference will be set to None
. A bit later on, tp_dealloc is called and invokes the __deallocate__
method. By that time, _parent
is None
, so accessing _parent._ring
is a bad idea, and in this case it turns out to be null.
Others have had similar problems before. There are crude workarounds floating around. I guess a proper solution would be twaking cython to allow custom code in the tp_clear function. In other words, have a "magic" mehod __clear__
similar to the magic __deallocate__
. But I'll wait for comments here first, before taking this to cython upstream. Perhaps people with more experience have better solutions to offer. And I won't mind if you decide to take this to Cython devs yourselves.
Apply
Apply:
- attachment: trac_11339_refcount_singular_rings.patch
- attachment: trac_11339_refcount_singular_polynomials.patch
Depends on #10903
Dependencies: #10903 (for doctests)
CC: @kiwifb @robertwb @burcin @malb @simon-king-jena @nexttime
Component: algebra
Keywords: sd31
Author: Volker Braun, Martin von Gagern
Reviewer: François Bissey, Steven Trogdon, Martin Albrecht
Merged: sage-4.7.2.alpha4
Issue created by migration from https://trac.sagemath.org/ticket/11339