[pypy-commit] pypy stmgc-c4: Enough to have test_targetdemo compile (but not run yet).
arigo
noreply at buildbot.pypy.org
Mon Jul 1 15:36:19 CEST 2013
Author: Armin Rigo <arigo at tunes.org>
Branch: stmgc-c4
Changeset: r65137:aef695dc9da1
Date: 2013-07-01 15:35 +0200
http://bitbucket.org/pypy/pypy/changeset/aef695dc9da1/
Log: Enough to have test_targetdemo compile (but not run yet).
diff --git a/rpython/rlib/rstm.py b/rpython/rlib/rstm.py
--- a/rpython/rlib/rstm.py
+++ b/rpython/rlib/rstm.py
@@ -1,5 +1,5 @@
from rpython.rlib.objectmodel import we_are_translated, specialize
-from rpython.rtyper.lltypesystem import lltype
+from rpython.rtyper.lltypesystem import lltype, rffi
from rpython.rtyper.lltypesystem.lloperation import llop
from rpython.rtyper.extregistry import ExtRegistryEntry
@@ -37,73 +37,48 @@
stmgcintf.StmOperations.abort_and_retry()
def before_external_call():
- if not is_atomic():
- e = get_errno()
- llop.stm_stop_transaction(lltype.Void)
- stmgcintf.StmOperations.commit_transaction()
- set_errno(e)
+ llop.stm_commit_transaction(lltype.Void)
before_external_call._dont_reach_me_in_del_ = True
before_external_call._transaction_break_ = True
def after_external_call():
- if not is_atomic():
- e = get_errno()
- stmgcintf.StmOperations.begin_inevitable_transaction()
- llop.stm_start_transaction(lltype.Void)
- set_errno(e)
+ llop.stm_begin_inevitable_transaction(lltype.Void)
after_external_call._dont_reach_me_in_del_ = True
after_external_call._transaction_break_ = True
def enter_callback_call():
- token = stmgcintf.StmOperations.descriptor_init()
- if token != 1:
- after_external_call()
- else:
- ll_assert(not is_atomic(), "new thread: is_atomic() != 0")
- stmgcintf.StmOperations.begin_inevitable_transaction()
- # the StmGCTLS is not built yet. leave it to gc_thread_start()
- return token
+ # XXX assumes that we're not called in a fresh new thread
+ llop.stm_begin_inevitable_transaction(lltype.Void)
+ return 0
enter_callback_call._dont_reach_me_in_del_ = True
enter_callback_call._transaction_break_ = True
-def leave_callback_call(token):
- if token != 1:
- before_external_call()
- else:
- # the StmGCTLS is already destroyed, done by gc_thread_die()
- # (we don't care if is_atomic() or not, we'll commit now)
- stmgcintf.StmOperations.commit_transaction()
- stmgcintf.StmOperations.descriptor_done()
+def leave_callback_call(ignored):
+ llop.stm_commit_transaction(lltype.Void)
leave_callback_call._dont_reach_me_in_del_ = True
leave_callback_call._transaction_break_ = True
# ____________________________________________________________
def make_perform_transaction(func, CONTAINERP):
+ from rpython.rtyper.annlowlevel import llhelper
+ from rpython.rtyper.annlowlevel import cast_instance_to_base_ptr
+ from rpython.translator.stm.stmgcintf import CALLBACK_TX
#
def _stm_callback(llcontainer, retry_counter):
- if not is_atomic():
- llop.stm_start_transaction(lltype.Void)
llcontainer = rffi.cast(CONTAINERP, llcontainer)
+ retry_counter = rffi.cast(lltype.Signed, retry_counter)
try:
res = func(llcontainer, retry_counter)
except Exception, e:
- res = 0 # stop perform_transaction() and returns
+ res = 0 # ends perform_transaction() and returns
lle = cast_instance_to_base_ptr(e)
llcontainer.got_exception = lle
- if not is_atomic():
- llop.stm_stop_transaction(lltype.Void)
- return res
+ return rffi.cast(rffi.INT_real, res)
#
def perform_transaction(llcontainer):
- before_external_call()
- adr_of_top = llop.gc_adr_of_root_stack_top(llmemory.Address)
- llcallback = llhelper(stmgcintf.StmOperations.CALLBACK_TX,
- _stm_callback)
- stmgcintf.StmOperations.perform_transaction(llcallback, llcontainer,
- adr_of_top)
- after_external_call()
- keepalive_until_here(llcontainer)
+ llcallback = llhelper(CALLBACK_TX, _stm_callback)
+ llop.stm_perform_transaction(lltype.Void, llcontainer, llcallback)
perform_transaction._transaction_break_ = True
#
return perform_transaction
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
@@ -440,6 +440,7 @@
'stm_set_transaction_length': LLOp(),
'stm_change_atomic': LLOp(),
'stm_get_atomic': LLOp(sideeffects=False),
+ 'stm_perform_transaction':LLOp(),
'stm_threadlocalref_get': LLOp(sideeffects=False),
'stm_threadlocalref_set': LLOp(),
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
@@ -603,6 +603,7 @@
OP_STM_GET_ATOMIC = _OP_STM
OP_STM_THREADLOCAL_GET = _OP_STM
OP_STM_THREADLOCAL_SET = _OP_STM
+ OP_STM_PERFORM_TRANSACTION = _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
@@ -6,6 +6,7 @@
class StmHeaderOpaqueDefNode(Node):
typetag = 'struct'
+ dependencies = ()
def __init__(self, db, T):
Node.__init__(self, db)
@@ -115,10 +116,10 @@
return '%s = stm_id((gcptr)%s);' % (result, arg0)
def stm_commit_transaction(funcgen, op):
- return 'stm_commit_transaction();'
+ return '{ int e = errno; stm_commit_transaction(); errno = e; }'
def stm_begin_inevitable_transaction(funcgen, op):
- return 'stm_begin_inevitable_transaction();'
+ return '{ int e = errno; stm_begin_inevitable_transaction(); errno = e; }'
def stm_should_break_transaction(funcgen, op):
result = funcgen.expr(op.result)
@@ -145,6 +146,11 @@
arg0 = funcgen.expr(op.args[0])
return 'stm_thread_local_obj = (gcptr)%s;' % (arg0,)
+def stm_perform_transaction(funcgen, op):
+ arg0 = funcgen.expr(op.args[0])
+ arg1 = funcgen.expr(op.args[1])
+ return 'stm_perform_transaction((gcptr)%s, %s);' % (arg0, arg1)
+
def op_stm(funcgen, op):
func = globals()[op.opname]
diff --git a/rpython/translator/stm/jitdriver.py b/rpython/translator/stm/jitdriver.py
--- a/rpython/translator/stm/jitdriver.py
+++ b/rpython/translator/stm/jitdriver.py
@@ -107,12 +107,9 @@
# turn the following link into an "if False" link, add a new
# "if True" link going to a fresh new block, and return this new
# block.
- funcptr = StmOperations.should_break_transaction
- c = Constant(funcptr, lltype.typeOf(funcptr))
- v1 = varoftype(lltype.Signed)
- block.operations.append(SpaceOperation('direct_call', [c], v1))
v2 = varoftype(lltype.Bool)
- block.operations.append(SpaceOperation('int_is_true', [v1], v2))
+ block.operations.append(
+ SpaceOperation('stm_should_break_transaction', [], v2))
#
assert block.exitswitch is None
[link] = block.exits
diff --git a/rpython/translator/stm/stmgcintf.py b/rpython/translator/stm/stmgcintf.py
--- a/rpython/translator/stm/stmgcintf.py
+++ b/rpython/translator/stm/stmgcintf.py
@@ -1,4 +1,5 @@
import os
+from rpython.rtyper.lltypesystem import lltype, rffi
from rpython.translator.tool.cbuild import ExternalCompilationInfo
from rpython.conftest import cdir as cdir2
@@ -30,3 +31,7 @@
pre_include_bits = ['#define RPY_STM 1'],
separate_module_sources = [separate_source],
)
+
+GCPTR = lltype.Ptr(rffi.COpaque('struct stm_object_s'))
+CALLBACK_TX = lltype.Ptr(lltype.FuncType([GCPTR, rffi.INT_real],
+ rffi.INT_real))
More information about the pypy-commit
mailing list