Author: Armin Rigo <[email protected]>
Branch: stmgc-c7
Changeset: r71047:5971a915100c
Date: 2014-04-28 19:05 +0200
http://bitbucket.org/pypy/pypy/changeset/5971a915100c/
Log: Test and implementation of a way to grab the longest_abort_info from
RPython
diff --git a/rpython/rlib/rstm.py b/rpython/rlib/rstm.py
--- a/rpython/rlib/rstm.py
+++ b/rpython/rlib/rstm.py
@@ -132,6 +132,16 @@
def pop_marker():
llop.stm_pop_marker(lltype.Void)
+def longest_abort_info():
+ state = llop.stm_longest_marker_state(lltype.Signed)
+ time = llop.stm_longest_marker_time(lltype.Float)
+ cself = llop.stm_longest_marker_self(rffi.CCHARP)
+ cother = llop.stm_longest_marker_other(rffi.CCHARP)
+ return (state, time, rffi.charp2str(cself), rffi.charp2str(cother))
+
+def reset_longest_abort_info():
+ llop.stm_reset_longest_marker_state(lltype.Void)
+
# ____________________________________________________________
def make_perform_transaction(func, CONTAINERP):
diff --git a/rpython/rtyper/lltypesystem/lloperation.py
b/rpython/rtyper/lltypesystem/lloperation.py
--- a/rpython/rtyper/lltypesystem/lloperation.py
+++ b/rpython/rtyper/lltypesystem/lloperation.py
@@ -457,22 +457,11 @@
'stm_expand_marker': LLOp(),
'stm_setup_expand_marker_for_pypy': LLOp(),
-## 'stm_allocate_nonmovable_int_adr': LLOp(sideeffects=False,
canmallocgc=True),
-## 'stm_become_inevitable': LLOp(canmallocgc=True),
-## 'stm_stop_all_other_threads': LLOp(canmallocgc=True),
-## 'stm_partial_commit_and_resume_other_threads': LLOp(canmallocgc=True),
-## 'stm_minor_collect': LLOp(canmallocgc=True),
-## 'stm_major_collect': LLOp(canmallocgc=True),
-## 'stm_get_tid': LLOp(canfold=True),
-## 'stm_ptr_eq': LLOp(canfold=True),
-
-## 'stm_weakref_allocate': LLOp(sideeffects=False, canmallocgc=True),
-
-## 'stm_get_adr_of_private_rev_num':LLOp(),
-## 'stm_get_adr_of_read_barrier_cache':LLOp(),
-## 'stm_get_adr_of_nursery_current': LLOp(),
-## 'stm_get_adr_of_nursery_nextlimit': LLOp(),
-## 'stm_get_adr_of_active': LLOp(),
+ 'stm_longest_marker_state': LLOp(),
+ 'stm_longest_marker_time': LLOp(),
+ 'stm_longest_marker_self': LLOp(),
+ 'stm_longest_marker_other': LLOp(),
+ 'stm_reset_longest_marker_state': LLOp(),
# __________ address operations __________
diff --git a/rpython/translator/stm/funcgen.py
b/rpython/translator/stm/funcgen.py
--- a/rpython/translator/stm/funcgen.py
+++ b/rpython/translator/stm/funcgen.py
@@ -239,3 +239,25 @@
assert len(offsets) == 4
return 'pypy_stm_setup_expand_marker(%s, %s, %s, %s);' % (
offsets[0], offsets[1], offsets[2], offsets[3])
+
+def stm_longest_marker_state(funcgen, op):
+ result = funcgen.expr(op.result)
+ return '%s = (Signed)stm_thread_local.longest_marker_state;' % (result,)
+
+def stm_longest_marker_time(funcgen, op):
+ result = funcgen.expr(op.result)
+ return '%s = stm_thread_local.longest_marker_time;' % (result,)
+
+def stm_longest_marker_self(funcgen, op):
+ result = funcgen.expr(op.result)
+ return '%s = stm_thread_local.longest_marker_self;' % (result,)
+
+def stm_longest_marker_other(funcgen, op):
+ result = funcgen.expr(op.result)
+ return '%s = stm_thread_local.longest_marker_other;' % (result,)
+
+def stm_reset_longest_marker_state(funcgen, op):
+ return ('stm_thread_local.longest_marker_state = 0;\n'
+ 'stm_thread_local.longest_marker_time = 0.0;\n'
+ 'stm_thread_local.longest_marker_self[0] = 0;\n'
+ 'stm_thread_local.longest_marker_other[0] = 0;')
diff --git a/rpython/translator/stm/test/test_ztranslated.py
b/rpython/translator/stm/test/test_ztranslated.py
--- a/rpython/translator/stm/test/test_ztranslated.py
+++ b/rpython/translator/stm/test/test_ztranslated.py
@@ -237,7 +237,6 @@
assert 'ok\n' in data
def test_abort_info(self):
- py.test.skip("goes away")
class Parent(object):
pass
class Foobar(Parent):
@@ -249,19 +248,12 @@
globf.xy = 100 + retry_counter
def check(_, retry_counter):
- rstm.abort_info_push(globf, ('[', 'xy', ']', 'yx'))
setxy(globf, retry_counter)
if retry_counter < 3:
rstm.abort_and_retry()
- #
- last = rstm.charp_inspect_abort_info()
- if last:
- print rffi.charp2str(last)
- else:
- print 'got abort_info=NULL!'
- print int(bool(rstm.charp_inspect_abort_info()))
- #
- rstm.abort_info_pop(2)
+ print rstm.longest_abort_info()
+ rstm.reset_longest_abort_info()
+ print rstm.longest_abort_info()
return 0
PS = lltype.Ptr(lltype.GcStruct('S', ('got_exception', OBJECTPTR)))
@@ -275,7 +267,10 @@
return 0
t, cbuilder = self.compile(main)
data = cbuilder.cmdexec('a b')
- assert 'li102ee10:hi there 3e\n0\n' in data
+ #
+ # 6 == STM_TIME_RUN_ABORTED_OTHER
+ import re; r = re.compile(r'\(6, 0.00\d+, , \)\n\(0, 0.00+, , \)\n$')
+ assert r.match(data)
def test_weakref(self):
import weakref
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit