Author: Remi Meier <[email protected]>
Branch: stmgc-c4
Changeset: r65200:f2a6fd3f14de
Date: 2013-07-05 15:10 +0200
http://bitbucket.org/pypy/pypy/changeset/f2a6fd3f14de/
Log: extract stm barriers from normal write barrier
diff --git a/rpython/jit/backend/llsupport/gc.py
b/rpython/jit/backend/llsupport/gc.py
--- a/rpython/jit/backend/llsupport/gc.py
+++ b/rpython/jit/backend/llsupport/gc.py
@@ -270,37 +270,24 @@
rst_addr = llop.gc_adr_of_root_stack_top(llmemory.Address)
return rffi.cast(lltype.Signed, rst_addr)
+
class WriteBarrierDescr(AbstractDescr):
- def __init__(self, gc_ll_descr, stmcat=None):
+ def __init__(self, gc_ll_descr):
self.llop1 = gc_ll_descr.llop1
- self.stmcat = stmcat
- self.returns_modified_object = (stmcat is not None)
- if not self.returns_modified_object:
- self.WB_FUNCPTR = lltype.Ptr(lltype.FuncType(
- [llmemory.Address], lltype.Void))
- else:
- self.WB_FUNCPTR_MOD = lltype.Ptr(lltype.FuncType(
- [llmemory.Address], llmemory.Address))
+
+ self.returns_modified_object = False
+ self.WB_FUNCPTR = lltype.Ptr(lltype.FuncType(
+ [llmemory.Address], lltype.Void))
+
self.fielddescr_tid = gc_ll_descr.fielddescr_tid
self.gcheaderbuilder = gc_ll_descr.gcheaderbuilder
self.HDRPTR = gc_ll_descr.HDRPTR
#
- if self.stmcat is not None:
- cfunc_name = self.stmcat[2]
- self.wb_failing_case_ptr = rffi.llexternal(
- cfunc_name,
- self.WB_FUNCPTR_MOD.TO.ARGS,
- self.WB_FUNCPTR_MOD.TO.RESULT,
- sandboxsafe=True,
- _nowrapper=True)
- #
GCClass = gc_ll_descr.GCClass
if GCClass is None: # for tests
return
- if self.stmcat is None:
- self.jit_wb_if_flag = GCClass.JIT_WB_IF_FLAG
- else:
- self.jit_wb_if_flag = self.stmcat[0]
+
+ self.jit_wb_if_flag = GCClass.JIT_WB_IF_FLAG
self.jit_wb_if_flag_byteofs, self.jit_wb_if_flag_singlebyte = (
self.extract_flag_byte(self.jit_wb_if_flag))
#
@@ -320,11 +307,7 @@
self.wb_slowpath = [0, 0, 0, 0]
def repr_of_descr(self):
- if self.stmcat is None:
- return 'wbdescr'
- else:
- cat = self.stmcat[1]
- return cat
+ return 'wbdescr'
def __repr__(self):
return '<WriteBarrierDescr %r>' % (self.repr_of_descr(),)
@@ -395,7 +378,41 @@
if returns_modified_object:
return gcref_struct
+class STMBarrierDescr(WriteBarrierDescr):
+ def __init__(self, gc_ll_descr, stmcat, cfunc_name):
+ WriteBarrierDescr.__init__(self, gc_ll_descr)
+ self.stmcat = stmcat
+ self.returns_modified_object = True
+ self.WB_FUNCPTR_MOD = lltype.Ptr(lltype.FuncType(
+ [llmemory.Address], llmemory.Address))
+ self.wb_failing_case_ptr = rffi.llexternal(
+ cfunc_name,
+ self.WB_FUNCPTR_MOD.TO.ARGS,
+ self.WB_FUNCPTR_MOD.TO.RESULT,
+ sandboxsafe=True,
+ _nowrapper=True)
+
+ def repr_of_descr(self):
+ cat = self.stmcat
+ return cat
+
+ def _do_barrier(self, gcref_struct, returns_modified_object):
+ raise NotImplemented
+
+class STMReadBarrierDescr(STMBarrierDescr):
+ def __init__(self, gc_ll_descr, stmcat):
+ assert stmcat == 'P2R'
+ STMBarrierDescr.__init__(self, gc_ll_descr, stmcat,
+ 'stm_DirectReadBarrier')
+
+class STMWriteBarrierDescr(STMBarrierDescr):
+ def __init__(self, gc_ll_descr, stmcat):
+ assert stmcat in ['P2W', 'R2W']
+ STMBarrierDescr.__init__(self, gc_ll_descr, stmcat,
+ 'stm_WriteBarrier')
+
+
class GcLLDescr_framework(GcLLDescription):
DEBUG = False # forced to True by x86/test/test_zrpy_gc.py
kind = 'framework'
@@ -494,14 +511,9 @@
self.do_write_barrier = do_write_barrier
def _setup_barriers_for_stm(self):
- from rpython.memory.gc import stmgc
- WBDescr = WriteBarrierDescr
- self.P2Rdescr = WBDescr(self, (0, 'P2R',
- 'stm_DirectReadBarrier'))
- self.P2Wdescr = WBDescr(self, (0, 'P2W',
- 'stm_WriteBarrier'))
- self.R2Wdescr = WBDescr(self, (0, 'R2W',
- 'stm_WriteBarrierFromReady'))
+ self.P2Rdescr = STMReadBarrierDescr(self, 'P2R')
+ self.P2Wdescr = STMWriteBarrierDescr(self, 'P2W')
+ self.R2Wdescr = STMWriteBarrierDescr(self, 'R2W')
self.write_barrier_descr = "wbdescr: do not use"
#
@specialize.argtype(0)
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit