Author: Armin Rigo <[email protected]>
Branch: stmgc-c4
Changeset: r65127:0d53a387555d
Date: 2013-06-30 20:04 +0200
http://bitbucket.org/pypy/pypy/changeset/0d53a387555d/

Log:    stm_atomic()

diff --git a/rpython/rlib/rstm.py b/rpython/rlib/rstm.py
--- a/rpython/rlib/rstm.py
+++ b/rpython/rlib/rstm.py
@@ -15,13 +15,13 @@
     llop.stm_set_transaction_length(lltype.Void, length)
 
 def increment_atomic():
-    stmgcintf.StmOperations.add_atomic(+1)
+    llop.stm_change_atomic(lltype.Signed, +1)
 
 def decrement_atomic():
-    stmgcintf.StmOperations.add_atomic(-1)
+    llop.stm_change_atomic(lltype.Signed, -1)
 
 def is_atomic():
-    return stmgcintf.StmOperations.get_atomic()
+    return llop.stm_get_atomic(lltype.Signed, 0)
 
 def abort_info_push(instance, fieldnames):
     "Special-cased below."
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
@@ -437,6 +437,8 @@
     'stm_begin_inevitable_transaction': LLOp(),
     'stm_should_break_transaction': LLOp(sideeffects=False),
     'stm_set_transaction_length': LLOp(),
+    'stm_change_atomic':      LLOp(),
+    'stm_get_atomic':         LLOp(sideeffects=False),
 
     # __________ address operations __________
 
diff --git a/rpython/translator/c/funcgen.py b/rpython/translator/c/funcgen.py
--- a/rpython/translator/c/funcgen.py
+++ b/rpython/translator/c/funcgen.py
@@ -599,6 +599,8 @@
     OP_STM_BEGIN_INEVITABLE_TRANSACTION = _OP_STM
     OP_STM_SHOULD_BREAK_TRANSACTION = _OP_STM
     OP_STM_SET_TRANSACTION_LENGTH = _OP_STM
+    OP_STM_CHANGE_ATOMIC = _OP_STM
+    OP_STM_GET_ATOMIC = _OP_STM
 
 
     def OP_PTR_NONZERO(self, op):
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
@@ -127,6 +127,14 @@
     arg0 = funcgen.expr(op.args[0])
     return 'stm_set_transaction_length(%s);' % (arg0,)
 
+def stm_change_atomic(funcgen, op):
+    arg0 = funcgen.expr(op.args[0])
+    return 'stm_atomic(%s);' % (arg0,)
+
+def stm_get_atomic(funcgen, op):
+    result = funcgen.expr(op.result)
+    return '%s = stm_atomic(0);' % (result,)
+
 
 def op_stm(funcgen, op):
     func = globals()[op.opname]
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
@@ -103,6 +103,18 @@
         cbuilder.cmdexec('')
         # assert did not crash
 
+    def test_stm_atomic(self):
+        def entry_point(argv):
+            assert not rstm.is_atomic()
+            rstm.increment_atomic()
+            assert rstm.is_atomic()
+            rstm.decrement_atomic()
+            assert not rstm.is_atomic()
+            return 0
+        t, cbuilder = self.compile(entry_point)
+        cbuilder.cmdexec('')
+        # assert did not crash
+
     def test_targetdemo(self):
         t, cbuilder = self.compile(targetdemo2.entry_point)
         data, dataerr = cbuilder.cmdexec('4 5000', err=True,
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to