[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