Author: Armin Rigo <[email protected]>
Branch: stm-thread-2
Changeset: r59970:7a6514ddc5de
Date: 2013-01-11 20:32 +0100
http://bitbucket.org/pypy/pypy/changeset/7a6514ddc5de/
Log: Start to adapt the targetdemo2 test.
diff --git a/pypy/translator/stm/test/targetdemo2.py
b/pypy/translator/stm/test/targetdemo2.py
--- a/pypy/translator/stm/test/targetdemo2.py
+++ b/pypy/translator/stm/test/targetdemo2.py
@@ -1,10 +1,10 @@
import time
from pypy.module.thread import ll_thread
-from pypy.rlib import rstm
+from pypy.rlib import rstm, jit
from pypy.rlib.objectmodel import invoke_around_extcall, we_are_translated
from pypy.rlib.objectmodel import compute_identity_hash
from pypy.rlib.debug import ll_assert
-from pypy.rpython.lltypesystem import lltype, rffi
+from pypy.rpython.lltypesystem import lltype, rffi, rclass
class Node:
@@ -65,6 +65,12 @@
print "check ok!"
+jitdriver_hash = jit.JitDriver(greens=[], reds=['self'])
+jitdriver_inev = jit.JitDriver(greens=[], reds=['self'])
+jitdriver_ptreq = jit.JitDriver(greens=[], reds=['self'])
+jitdriver_really = jit.JitDriver(greens=[], reds=['self'])
+
+
class ThreadRunner(object):
arg = None
@@ -77,21 +83,23 @@
try:
self.value = 0
self.lst = []
- rstm.perform_transaction(ThreadRunner.check_hash,
- ThreadRunner, self)
+ self.do_check_hash()
self.value = 0
- rstm.perform_transaction(ThreadRunner.check_inev,
- ThreadRunner, self)
+ self.do_check_inev()
self.value = 0
self.arg = Arg()
self.glob_p = lltype.malloc(STRUCT)
- rstm.perform_transaction(ThreadRunner.check_ptr_equality,
- ThreadRunner, self)
- rstm.perform_transaction(ThreadRunner.run_really,
- ThreadRunner, self)
+ self.do_check_ptr_equality()
+ self.do_run_really()
finally:
self.finished_lock.release()
+ def do_run_really(self):
+ while True:
+ jitdriver_really.jit_merge_point(self=self)
+ if not self.run_really(0):
+ break
+
def run_really(self, retry_counter):
if self.value == glob.LENGTH // 2:
print "atomic!"
@@ -106,7 +114,11 @@
#
add_at_end_of_chained_list(glob.anchor, self.value, self.index)
self.value += 1
- return int(self.value < glob.LENGTH)
+ return self.value < glob.LENGTH
+
+ def do_check_ptr_equality(self):
+ jitdriver_ptreq.jit_merge_point(self=self)
+ self.check_ptr_equality(0)
def check_ptr_equality(self, retry_counter):
assert self.glob_p != lltype.nullptr(STRUCT)
@@ -115,7 +127,12 @@
raw1 = rffi.cast(rffi.CCHARP, retry_counter)
raw2 = rffi.cast(rffi.CCHARP, -1)
ll_assert(raw1 != raw2, "ERROR: retry_counter == -1")
- return 0
+
+ def do_check_inev(self):
+ while True:
+ jitdriver_inev.jit_merge_point(self=self)
+ if not self.check_inev(0):
+ break
def _check_content(self, content):
ll_assert(glob.othernode2.value == content, "bogus value after inev")
@@ -135,7 +152,13 @@
for n in glob.othernodes: # lots of unrelated writes in-between
n.value = new_value
glob.othernode2.value = new_value
- return int(self.value < glob.LENGTH)
+ return self.value < glob.LENGTH
+
+ def do_check_hash(self):
+ while True:
+ jitdriver_hash.jit_merge_point(self=self)
+ if not self.check_hash(0):
+ break
def check_hash(self, retry_counter):
if self.value == 0:
@@ -152,7 +175,7 @@
x.value += 1
assert compute_identity_hash(x) == expected_hash
self.value += 20
- return int(self.value < glob.LENGTH)
+ return self.value < glob.LENGTH
class Arg:
foobar = 42
@@ -180,9 +203,8 @@
bootstrapper.lock = None
bootstrapper.args = None
- def _freeze_(self):
+ def _cleanup_(self):
self.reinit()
- return False
@staticmethod
def bootstrap():
diff --git a/pypy/translator/stm/test/test_jitdriver.py
b/pypy/translator/stm/test/test_jitdriver.py
--- a/pypy/translator/stm/test/test_jitdriver.py
+++ b/pypy/translator/stm/test/test_jitdriver.py
@@ -35,3 +35,17 @@
res = self.interpret(f1, ['\x03', rffi.cast(rffi.SHORT, 4), 2])
assert res == 'X'
+
+ def test_loop_void_result(self):
+ class X:
+ counter = 10
+ x = X()
+ myjitdriver = JitDriver(greens=[], reds=[])
+
+ def f1():
+ while x.counter > 0:
+ myjitdriver.jit_merge_point()
+ x.counter -= 1
+
+ res = self.interpret(f1, [])
+ assert res == None
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit