Author: Armin Rigo <[email protected]>
Branch: stmgc-c4
Changeset: r66859:663ecda0e4d8
Date: 2013-09-09 14:30 +0200
http://bitbucket.org/pypy/pypy/changeset/663ecda0e4d8/
Log: Make the raw JITFRAMEINFO STM-free, by using only one field in case
of STM and by updating its value carefully with bool_cas().
diff --git a/rpython/jit/backend/llsupport/jitframe.py
b/rpython/jit/backend/llsupport/jitframe.py
--- a/rpython/jit/backend/llsupport/jitframe.py
+++ b/rpython/jit/backend/llsupport/jitframe.py
@@ -3,6 +3,7 @@
from rpython.rlib.objectmodel import specialize
from rpython.rlib.debug import ll_assert
from rpython.rlib.objectmodel import enforceargs
+from rpython.rlib.rgc import stm_is_enabled
SIZEOFSIGNED = rffi.sizeof(lltype.Signed)
IS_32BIT = (SIZEOFSIGNED == 4)
@@ -16,6 +17,22 @@
@enforceargs(None, int, int)
def jitframeinfo_update_depth(jfi, base_ofs, new_depth):
+ #
+ if stm_is_enabled():
+ from rpython.rlib.atomic_ops import bool_cas
+ # careful here, 'jfi' has 'stm_dont_track_raw_accesses'
+ while True:
+ old_depth = jfi.jfi_frame_depth
+ if new_depth <= old_depth:
+ break # only ever increase the depth
+ if bool_cas(rffi.cast(llmemory.Address, jfi),
+ rffi.cast(llmemory.Address, old_depth),
+ rffi.cast(llmemory.Address, new_depth)):
+ break
+ # note that we don't set jfi_frame_size at all if STM,
+ # to avoid concurrency issues
+ return
+ #
if new_depth > jfi.jfi_frame_depth:
jfi.jfi_frame_depth = new_depth
jfi.jfi_frame_size = base_ofs + new_depth * SIZEOFSIGNED
@@ -31,11 +48,12 @@
# the depth of the frame
('jfi_frame_depth', lltype.Signed),
# the total size of the frame, in bytes
- ('jfi_frame_size', lltype.Signed),
+ ('jfi_frame_size', lltype.Signed), # <- not set if STM
adtmeths = {
'update_frame_depth': jitframeinfo_update_depth,
'clear': jitframeinfo_clear,
},
+ hints = {'stm_dont_track_raw_accesses': True},
)
NULLFRAMEINFO = lltype.nullptr(JITFRAMEINFO)
diff --git a/rpython/jit/backend/llsupport/rewrite.py
b/rpython/jit/backend/llsupport/rewrite.py
--- a/rpython/jit/backend/llsupport/rewrite.py
+++ b/rpython/jit/backend/llsupport/rewrite.py
@@ -157,9 +157,10 @@
else:
raise NotImplementedError(op.getopname())
- def gen_malloc_frame(self, frame_info, frame, size_box):
+ def gen_malloc_frame(self, frame_info, frame):
+ size_box = history.BoxInt()
descrs = self.gc_ll_descr.getframedescrs(self.cpu)
- if self.gc_ll_descr.kind == 'boehm':
+ if self.gc_ll_descr.kind == 'boehm' or self.gc_ll_descr.stm:
op0 = ResOperation(rop.GETFIELD_GC, [history.ConstInt(frame_info)],
size_box,
descr=descrs.jfi_frame_depth)
@@ -169,6 +170,7 @@
self.handle_new_array(descrs.arraydescr, op1)
else:
# we read size in bytes here, not the length
+ # (this path is only used in non-STM mode)
op0 = ResOperation(rop.GETFIELD_GC, [history.ConstInt(frame_info)],
size_box,
descr=descrs.jfi_frame_size)
@@ -189,9 +191,8 @@
assert isinstance(loop_token, history.JitCellToken)
jfi = loop_token.compiled_loop_token.frame_info
llfi = heaptracker.adr2int(llmemory.cast_ptr_to_adr(jfi))
- size_box = history.BoxInt()
frame = history.BoxPtr()
- self.gen_malloc_frame(llfi, frame, size_box)
+ self.gen_malloc_frame(llfi, frame)
op2 = ResOperation(rop.SETFIELD_GC, [frame, history.ConstInt(llfi)],
None, descr=descrs.jf_frame_info)
self.newops.append(op2)
diff --git a/rpython/jit/backend/llsupport/stmrewrite.py
b/rpython/jit/backend/llsupport/stmrewrite.py
--- a/rpython/jit/backend/llsupport/stmrewrite.py
+++ b/rpython/jit/backend/llsupport/stmrewrite.py
@@ -152,13 +152,13 @@
if c == 'R':
self.known_category[v] = 'P'
- def gen_malloc_nursery_varsize_frame(self, sizebox, v_result, tid):
- """ For now don't generate CALL_MALLOC_NURSERY_VARSIZE_FRAME
- """
- addr = self.gc_ll_descr.get_malloc_fn_addr('malloc_big_fixedsize')
- args = [ConstInt(addr), sizebox, ConstInt(tid)]
- descr = self.gc_ll_descr.malloc_big_fixedsize_descr
- self._gen_call_malloc_gc(args, v_result, descr)
+## def gen_malloc_nursery_varsize_frame(self, sizebox, v_result, tid):
+## """ For now don't generate CALL_MALLOC_NURSERY_VARSIZE_FRAME
+## """
+## addr = self.gc_ll_descr.get_malloc_fn_addr('malloc_big_fixedsize')
+## args = [ConstInt(addr), sizebox, ConstInt(tid)]
+## descr = self.gc_ll_descr.malloc_big_fixedsize_descr
+## self._gen_call_malloc_gc(args, v_result, descr)
def gen_write_barrier(self, v):
raise NotImplementedError
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit