[pypy-commit] pypy cpyext-gc-support: Adapt to the new version of rawrefcount.rst

arigo noreply at buildbot.pypy.org
Fri Oct 16 11:51:05 EDT 2015


Author: Armin Rigo <arigo at tunes.org>
Branch: cpyext-gc-support
Changeset: r80284:d6b9e7532feb
Date: 2015-10-16 14:05 +0200
http://bitbucket.org/pypy/pypy/changeset/d6b9e7532feb/

Log:	Adapt to the new version of rawrefcount.rst

diff --git a/rpython/rlib/rawrefcount.py b/rpython/rlib/rawrefcount.py
--- a/rpython/rlib/rawrefcount.py
+++ b/rpython/rlib/rawrefcount.py
@@ -1,7 +1,7 @@
 #
 #  See documentation in pypy/doc/discussion/rawrefcount.rst
 #
-import weakref
+import sys, weakref
 from rpython.rtyper.lltypesystem import lltype, llmemory
 from rpython.rlib.objectmodel import we_are_translated, specialize
 from rpython.rtyper.extregistry import ExtRegistryEntry
@@ -9,14 +9,14 @@
 from rpython.rlib import rgc
 
 
-REFCNT_FROM_PYPY_OBJECT = 80   # == 0x50
+REFCNT_FROM_PYPY        = 80
+REFCNT_FROM_PYPY_DIRECT = REFCNT_FROM_PYPY + (sys.maxint//2+1)
 
 
 def _reset_state():
-    global _p_list, _o_list, _s_list, _adr2pypy, _pypy2ob
+    global _p_list, _o_list, _adr2pypy, _pypy2ob
     _p_list = []     # not rpython
     _o_list = []     # not rpython
-    _s_list = []     # not rpython
     _adr2pypy = [None]  # not rpython
     _pypy2ob = {}       # not rpython
 _reset_state()
@@ -32,7 +32,6 @@
     assert p not in _pypy2ob
     assert not ob.c_ob_pypy_link
     ob.c_ob_pypy_link = _build_pypy_link(p)
-    ob.c_ob_refcnt += REFCNT_FROM_PYPY_OBJECT
     _pypy2ob[p] = ob
     _p_list.append(ob)
 
@@ -42,18 +41,8 @@
     assert p not in _pypy2ob
     assert not ob.c_ob_pypy_link
     ob.c_ob_pypy_link = _build_pypy_link(p)
-    ob.c_ob_refcnt += REFCNT_FROM_PYPY_OBJECT
     _o_list.append(ob)
 
-def create_link_shared(p, ob):
-    """NOT_RPYTHON: a link where both p and ob contain some data.
-       from_obj() will not work on this 'p'."""
-    assert p not in _pypy2ob
-    assert not ob.c_ob_pypy_link
-    ob.c_ob_pypy_link = _build_pypy_link(p)
-    ob.c_ob_refcnt += REFCNT_FROM_PYPY_OBJECT
-    _s_list.append(ob)
-
 def from_obj(OB_PTR_TYPE, p):
     "NOT_RPYTHON"
     ob = _pypy2ob.get(p)
@@ -81,7 +70,7 @@
     from the O list.
     """
     def detach(ob, wr_list):
-        assert ob.c_ob_refcnt >= REFCNT_FROM_PYPY_OBJECT
+        assert ob.c_ob_refcnt >= REFCNT_FROM_PYPY
         assert ob.c_ob_pypy_link
         p = _adr2pypy[ob.c_ob_pypy_link]
         assert p is not None
@@ -93,7 +82,7 @@
     wr_p_list = []
     new_p_list = []
     for ob in _p_list:
-        if ob.c_ob_refcnt > REFCNT_FROM_PYPY_OBJECT:
+        if ob.c_ob_refcnt not in (REFCNT_FROM_PYPY, REFCNT_FROM_PYPY_DIRECT):
             new_p_list.append(ob)
         else:
             p = detach(ob, wr_p_list)
@@ -102,16 +91,6 @@
         ob = None
     _p_list = Ellipsis
 
-    wr_s_list = []
-    new_s_list = []
-    for ob in _s_list:
-        if ob.c_ob_refcnt > REFCNT_FROM_PYPY_OBJECT:
-            new_s_list.append(ob)
-        else:
-            detach(ob, wr_s_list)
-        ob = None
-    _s_list = Ellipsis
-
     wr_o_list = []
     for ob in _o_list:
         detach(ob, wr_o_list)
@@ -122,7 +101,7 @@
     rgc.collect()
 
     def attach(ob, wr, final_list):
-        assert ob.c_ob_refcnt >= REFCNT_FROM_PYPY_OBJECT
+        assert ob.c_ob_refcnt >= REFCNT_FROM_PYPY
         p = wr()
         if p is not None:
             assert ob.c_ob_pypy_link
@@ -130,23 +109,23 @@
             final_list.append(ob)
             return p
         else:
-            ob.c_ob_refcnt -= REFCNT_FROM_PYPY_OBJECT
             ob.c_ob_pypy_link = 0
-            if ob.c_ob_refcnt == 0 and dealloc is not None:
-                dealloc.append(ob)
+            if ob.c_ob_refcnt == REFCNT_FROM_PYPY_DIRECT:
+                pass    # freed
+            elif ob.c_ob_refcnt > REFCNT_FROM_PYPY_DIRECT:
+                ob.c_ob_refcnt -= REFCNT_FROM_PYPY_DIRECT
+            else:
+                ob.c_ob_refcnt -= REFCNT_FROM_PYPY
+                if ob.c_ob_refcnt == 0:
+                    dealloc.append(ob)
             return None
 
+    dealloc = []
     _p_list = new_p_list
-    dealloc = None
     for ob, wr in wr_p_list:
         p = attach(ob, wr, _p_list)
         if p:
             _pypy2ob[p] = ob
-    #
-    dealloc = []
-    _s_list = new_s_list
-    for ob, wr in wr_s_list:
-        attach(ob, wr, _s_list)
     _o_list = []
     for ob, wr in wr_o_list:
         attach(ob, wr, _o_list)
diff --git a/rpython/rlib/test/test_rawrefcount.py b/rpython/rlib/test/test_rawrefcount.py
--- a/rpython/rlib/test/test_rawrefcount.py
+++ b/rpython/rlib/test/test_rawrefcount.py
@@ -1,5 +1,6 @@
 import weakref
 from rpython.rlib import rawrefcount
+from rpython.rlib.rawrefcount import REFCNT_FROM_PYPY, REFCNT_FROM_PYPY_DIRECT
 from rpython.rtyper.lltypesystem import lltype, llmemory
 
 class W_Root(object):
@@ -24,6 +25,8 @@
         assert rawrefcount.from_obj(PyObject, p) == lltype.nullptr(PyObjectS)
         assert rawrefcount.to_obj(W_Root, ob) == None
         rawrefcount.create_link_pypy(p, ob)
+        assert ob.c_ob_refcnt == 0
+        ob.c_ob_refcnt += REFCNT_FROM_PYPY_DIRECT
         assert rawrefcount.from_obj(PyObject, p) == ob
         assert rawrefcount.to_obj(W_Root, ob) == p
 
@@ -34,16 +37,8 @@
         assert rawrefcount.from_obj(PyObject, p) == lltype.nullptr(PyObjectS)
         assert rawrefcount.to_obj(W_Root, ob) == None
         rawrefcount.create_link_pyobj(p, ob)
-        assert rawrefcount.from_obj(PyObject, p) == lltype.nullptr(PyObjectS)
-        assert rawrefcount.to_obj(W_Root, ob) == p
-
-    def test_create_link_shared(self):
-        p = W_Root(42)
-        ob = lltype.malloc(PyObjectS, flavor='raw', zero=True,
-                           track_allocation=False)
-        assert rawrefcount.from_obj(PyObject, p) == lltype.nullptr(PyObjectS)
-        assert rawrefcount.to_obj(W_Root, ob) == None
-        rawrefcount.create_link_shared(p, ob)
+        assert ob.c_ob_refcnt == 0
+        ob.c_ob_refcnt += REFCNT_FROM_PYPY
         assert rawrefcount.from_obj(PyObject, p) == lltype.nullptr(PyObjectS)
         assert rawrefcount.to_obj(W_Root, ob) == p
 
@@ -52,6 +47,7 @@
         ob = lltype.malloc(PyObjectS, flavor='raw', zero=True,
                            track_allocation=False)
         rawrefcount.create_link_pypy(p, ob)
+        ob.c_ob_refcnt += REFCNT_FROM_PYPY_DIRECT
         assert rawrefcount._p_list == [ob]
         wr_ob = weakref.ref(ob)
         wr_p = weakref.ref(p)
@@ -66,6 +62,7 @@
         ob = lltype.malloc(PyObjectS, flavor='raw', zero=True,
                            track_allocation=False)
         rawrefcount.create_link_pypy(p, ob)
+        ob.c_ob_refcnt += REFCNT_FROM_PYPY_DIRECT
         assert rawrefcount._p_list == [ob]
         wr_ob = weakref.ref(ob)
         wr_p = weakref.ref(p)
@@ -84,6 +81,7 @@
         ob = lltype.malloc(PyObjectS, flavor='raw', zero=True,
                            track_allocation=False)
         rawrefcount.create_link_pypy(p, ob)
+        ob.c_ob_refcnt += REFCNT_FROM_PYPY_DIRECT
         assert rawrefcount._p_list == [ob]
         wr_ob = weakref.ref(ob)
         del ob       # p remains
@@ -99,6 +97,7 @@
         ob = lltype.malloc(PyObjectS, flavor='raw', zero=True,
                            track_allocation=False)
         rawrefcount.create_link_pyobj(p, ob)
+        ob.c_ob_refcnt += REFCNT_FROM_PYPY
         assert rawrefcount._o_list == [ob]
         wr_ob = weakref.ref(ob)
         wr_p = weakref.ref(p)
@@ -116,6 +115,7 @@
                            track_allocation=False)
         p.pyobj = ob
         rawrefcount.create_link_pyobj(p, ob)
+        ob.c_ob_refcnt += REFCNT_FROM_PYPY
         assert rawrefcount._o_list == [ob]
         wr_ob = weakref.ref(ob)
         wr_p = weakref.ref(p)
@@ -135,6 +135,7 @@
                            track_allocation=False)
         p.pyobj = ob
         rawrefcount.create_link_pyobj(p, ob)
+        ob.c_ob_refcnt += REFCNT_FROM_PYPY
         assert rawrefcount._o_list == [ob]
         wr_ob = weakref.ref(ob)
         del ob       # p remains
@@ -150,8 +151,9 @@
         p = W_Root(42)
         ob = lltype.malloc(PyObjectS, flavor='raw', zero=True,
                            track_allocation=False)
-        rawrefcount.create_link_shared(p, ob)
-        assert rawrefcount._s_list == [ob]
+        rawrefcount.create_link_pypy(p, ob)
+        ob.c_ob_refcnt += REFCNT_FROM_PYPY
+        assert rawrefcount._p_list == [ob]
         wr_ob = weakref.ref(ob)
         wr_p = weakref.ref(p)
         del ob, p
@@ -159,7 +161,7 @@
         ob = wr_ob()
         assert ob is not None
         assert dealloc == [ob]
-        assert rawrefcount._s_list == []
+        assert rawrefcount._p_list == []
         assert wr_p() is None
 
     def test_collect_s_keepalive_pyobject(self):
@@ -167,8 +169,9 @@
         ob = lltype.malloc(PyObjectS, flavor='raw', zero=True,
                            track_allocation=False)
         p.pyobj = ob
-        rawrefcount.create_link_shared(p, ob)
-        assert rawrefcount._s_list == [ob]
+        rawrefcount.create_link_pypy(p, ob)
+        ob.c_ob_refcnt += REFCNT_FROM_PYPY
+        assert rawrefcount._p_list == [ob]
         wr_ob = weakref.ref(ob)
         wr_p = weakref.ref(p)
         ob.c_ob_refcnt += 1      # <=
@@ -177,7 +180,7 @@
         ob = wr_ob()
         p = wr_p()
         assert ob is not None and p is not None
-        assert rawrefcount._s_list == [ob]
+        assert rawrefcount._p_list == [ob]
         assert rawrefcount.to_obj(W_Root, ob) == p
 
     def test_collect_s_keepalive_w_root(self):
@@ -185,13 +188,14 @@
         ob = lltype.malloc(PyObjectS, flavor='raw', zero=True,
                            track_allocation=False)
         p.pyobj = ob
-        rawrefcount.create_link_shared(p, ob)
-        assert rawrefcount._s_list == [ob]
+        rawrefcount.create_link_pypy(p, ob)
+        ob.c_ob_refcnt += REFCNT_FROM_PYPY
+        assert rawrefcount._p_list == [ob]
         wr_ob = weakref.ref(ob)
         del ob       # p remains
         dealloc = rawrefcount._collect()
         assert dealloc == []
         ob = wr_ob()
         assert ob is not None
-        assert rawrefcount._s_list == [ob]
+        assert rawrefcount._p_list == [ob]
         assert rawrefcount.to_obj(W_Root, ob) == p


More information about the pypy-commit mailing list