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

Reply via email to