# HG changeset patch
# User David Roe <roed.math@gmail.com>
# Date 1340303091 14400
# Node ID 2877d084a44d4907d9fd14120929578d23e6aa50
# Parent bb37f43b5feaf166b5835cfccf17235fe6fbd94c
#13145: Add refcounting code in sage.rings.polynomial.plural.new_NRing and new_CRing.
diff --git a/sage/libs/singular/ring.pxd b/sage/libs/singular/ring.pxd
a
|
b
|
|
53 | 53 | |
54 | 54 | # carefully delete a ring once its refcount is zero |
55 | 55 | cdef void singular_ring_delete(ring *doomed) |
| 56 | |
| 57 | # Used internally for reference counting |
| 58 | cdef wrap_ring(ring* R) |
diff --git a/sage/libs/singular/ring.pyx b/sage/libs/singular/ring.pyx
a
|
b
|
|
586 | 586 | """ |
587 | 587 | cdef size_t addr = <size_t>currRing |
588 | 588 | print "DEBUG: currRing == "+str(hex(addr)) |
| 589 | |
| 590 | def currRing_wrapper(): |
| 591 | """ |
| 592 | Returns a wrapper for the current ring, for use in debugging ring_refcount_dict. |
| 593 | |
| 594 | EXAMPLES:: |
| 595 | |
| 596 | sage: from sage.libs.singular.ring import currRing_wrapper |
| 597 | sage: currRing_wrapper() |
| 598 | The ring pointer ... |
| 599 | """ |
| 600 | return wrap_ring(currRing) |
diff --git a/sage/rings/polynomial/plural.pyx b/sage/rings/polynomial/plural.pyx
a
|
b
|
|
111 | 111 | from sage.structure.parent_gens cimport ParentWithGens |
112 | 112 | |
113 | 113 | # singular rings |
114 | | from sage.libs.singular.ring cimport singular_ring_new, singular_ring_delete |
| 114 | from sage.libs.singular.ring cimport singular_ring_new, singular_ring_delete, wrap_ring |
| 115 | import sage.libs.singular.ring |
115 | 116 | |
116 | 117 | from sage.rings.integer cimport Integer |
117 | 118 | from sage.structure.element cimport Element, ModuleElement |
… |
… |
|
2705 | 2706 | sage: R = new_CRing(W, H.base_ring()) |
2706 | 2707 | sage: R # indirect doctest |
2707 | 2708 | Multivariate Polynomial Ring in x, y, z over Rational Field |
| 2709 | |
| 2710 | Check that #13145 has been resolved:: |
| 2711 | |
| 2712 | sage: h = hash(R.gen() + 1) # sets currRing |
| 2713 | sage: from sage.libs.singular.ring import ring_refcount_dict, currRing_wrapper |
| 2714 | sage: curcnt = ring_refcount_dict[currRing_wrapper()] |
| 2715 | sage: newR = new_CRing(W, H.base_ring()) |
| 2716 | sage: ring_refcount_dict[currRing_wrapper()] - curcnt |
| 2717 | 1 |
2708 | 2718 | """ |
2709 | 2719 | assert( rw.is_commutative() ) |
2710 | 2720 | |
2711 | 2721 | cdef MPolynomialRing_libsingular self = <MPolynomialRing_libsingular>PY_NEW(MPolynomialRing_libsingular) |
2712 | 2722 | |
2713 | 2723 | self._ring = rw._ring |
| 2724 | |
| 2725 | wrapped_ring = wrap_ring(self._ring) |
| 2726 | cur_refcnt = sage.libs.singular.ring.ring_refcount_dict.get(wrapped_ring, 0) |
| 2727 | sage.libs.singular.ring.ring_refcount_dict[wrapped_ring] = cur_refcnt + 1 |
| 2728 | |
2714 | 2729 | self._ring.ShortOut = 0 |
2715 | 2730 | |
2716 | 2731 | self.__ngens = rw.ngens() |
… |
… |
|
2773 | 2788 | |
2774 | 2789 | cdef NCPolynomialRing_plural self = <NCPolynomialRing_plural>PY_NEW(NCPolynomialRing_plural) |
2775 | 2790 | self._ring = rw._ring |
| 2791 | |
| 2792 | wrapped_ring = wrap_ring(self._ring) |
| 2793 | cur_refcnt = sage.libs.singular.ring.ring_refcount_dict.get(wrapped_ring, 0) |
| 2794 | sage.libs.singular.ring.ring_refcount_dict[wrapped_ring] = cur_refcnt + 1 |
| 2795 | |
2776 | 2796 | self._ring.ShortOut = 0 |
2777 | 2797 | |
2778 | 2798 | self.__ngens = rw.ngens() |