Author: Armin Rigo <ar...@tunes.org> Branch: stm-thread-2 Changeset: r57175:e4a73bd95338 Date: 2012-09-06 15:38 +0200 http://bitbucket.org/pypy/pypy/changeset/e4a73bd95338/
Log: Hacks to get Boehm to translate and run. Crashes, but that may be a genuine bug. diff --git a/pypy/rpython/memory/gctransform/boehm.py b/pypy/rpython/memory/gctransform/boehm.py --- a/pypy/rpython/memory/gctransform/boehm.py +++ b/pypy/rpython/memory/gctransform/boehm.py @@ -57,7 +57,7 @@ self.mixlevelannotator.finish() # for now self.mixlevelannotator.backend_optimize() - def gcheader_initdata(self, hdr): + def gcheader_initdata(self, hdr, ptr): pass def push_alive_nopyobj(self, var, llops): diff --git a/pypy/rpython/memory/gctransform/boehmstm.py b/pypy/rpython/memory/gctransform/boehmstm.py --- a/pypy/rpython/memory/gctransform/boehmstm.py +++ b/pypy/rpython/memory/gctransform/boehmstm.py @@ -1,5 +1,5 @@ from pypy.rpython.memory.gctransform.boehm import BoehmGCTransformer -from pypy.rpython.lltypesystem import lltype +from pypy.rpython.lltypesystem import lltype, llmemory from pypy.rlib.rarithmetic import r_uint, LONG_BIT @@ -13,9 +13,18 @@ class BoehmSTMGCTransformer(BoehmGCTransformer): HDR = lltype.Struct("header", ("hash", lltype.Signed), + ("size", lltype.Signed), ("tid", lltype.Signed), # for flags only ("revision", lltype.Unsigned)) - def gcheader_initdata(self, hdr): + def gcheader_initdata(self, hdr, ptr): + ptr = lltype.normalizeptr(ptr) + TYPE = lltype.typeOf(ptr).TO + if TYPE._is_varsize(): + while isinstance(ptr._T, lltype.Struct): + ptr = getattr(ptr, ptr._T._arrayfld) + hdr.size = llmemory.sizeof(TYPE, len(ptr)) + else: + hdr.size = llmemory.sizeof(TYPE) hdr.tid = GCFLAG_PREBUILT hdr.revision = REV_INITIAL diff --git a/pypy/translator/c/gc.py b/pypy/translator/c/gc.py --- a/pypy/translator/c/gc.py +++ b/pypy/translator/c/gc.py @@ -207,9 +207,10 @@ def common_gcheader_initdata(self, defnode): if defnode.db.gctransformer is not None: + ptr = defnode.obj._as_ptr() hdr = lltype.malloc(defnode.db.gctransformer.HDR, immortal=True) - hdr.hash = lltype.identityhash_nocache(defnode.obj._as_ptr()) - defnode.db.gctransformer.gcheader_initdata(hdr) + hdr.hash = lltype.identityhash_nocache(ptr) + defnode.db.gctransformer.gcheader_initdata(hdr, ptr) return hdr._obj return None diff --git a/pypy/translator/c/genc.py b/pypy/translator/c/genc.py --- a/pypy/translator/c/genc.py +++ b/pypy/translator/c/genc.py @@ -473,8 +473,12 @@ from pypy.rpython.lltypesystem import rffi from pypy.rpython.annlowlevel import MixLevelHelperAnnotator entrypoint = self.entrypoint + stm = self.config.translation.stm # def entrypoint_wrapper(argc, argv): + if stm: + from pypy.translator.stm.funcgen import _stm_init_function + _stm_init_function() list = [""] * argc i = 0 while i < argc: diff --git a/pypy/translator/c/src/mem.h b/pypy/translator/c/src/mem.h --- a/pypy/translator/c/src/mem.h +++ b/pypy/translator/c/src/mem.h @@ -178,16 +178,13 @@ /* #define BOEHM_MALLOC_0_1 GC_MALLOC_IGNORE_OFF_PAGE */ /* #define BOEHM_MALLOC_1_1 GC_MALLOC_ATOMIC_IGNORE_OFF_PAGE */ -#ifndef _BOEHM_ALLOCATED -# define _BOEHM_ALLOCATED(r) /* nothing */ -#endif - +#ifndef OP_BOEHM_ZERO_MALLOC /* may be defined already by src_stm/et.h */ #define OP_BOEHM_ZERO_MALLOC(size, r, restype, is_atomic, is_varsize) { \ r = (restype) BOEHM_MALLOC_ ## is_atomic ## _ ## is_varsize (size); \ if (r && is_atomic) /* the non-atomic versions return cleared memory */ \ memset((void*) r, 0, size); \ - _BOEHM_ALLOCATED(r); \ } +#endif #define OP_BOEHM_DISAPPEARING_LINK(link, obj, r) \ if (GC_base(obj) == NULL) \ diff --git a/pypy/translator/stm/funcgen.py b/pypy/translator/stm/funcgen.py --- a/pypy/translator/stm/funcgen.py +++ b/pypy/translator/stm/funcgen.py @@ -1,4 +1,5 @@ from pypy.translator.c.support import c_string_constant +from pypy.translator.stm.stmgcintf import StmOperations def stm_start_transaction(funcgen, op): @@ -38,6 +39,11 @@ XXX return funcgen.OP_DIRECT_CALL(op) +def _stm_init_function(): + """Called at process start-up.""" + StmOperations.descriptor_init() + StmOperations.begin_inevitable_transaction() + def op_stm(funcgen, op): func = globals()[op.opname] diff --git a/pypy/translator/stm/src_stm/et.h b/pypy/translator/stm/src_stm/et.h --- a/pypy/translator/stm/src_stm/et.h +++ b/pypy/translator/stm/src_stm/et.h @@ -113,9 +113,10 @@ # define OP_GC_ADR_OF_ROOT_STACK_TOP(r) r = NULL void stm_boehm_start_transaction(void); void stm_boehm_stop_transaction(void); -void stm_boehm_allocated(gcptr); -# undef _BOEHM_ALLOCATED -# define _BOEHM_ALLOCATED(r) stm_boehm_allocated((gcptr)(r)) +gcptr stm_boehm_allocate(size_t); +# undef OP_BOEHM_ZERO_MALLOC +# define OP_BOEHM_ZERO_MALLOC(size, r, restype, is_atomic, is_varsize) \ + r = (restype) stm_boehm_allocate(size) #endif #endif /* _ET_H */ diff --git a/pypy/translator/stm/src_stm/rpyintf.c b/pypy/translator/stm/src_stm/rpyintf.c --- a/pypy/translator/stm/src_stm/rpyintf.c +++ b/pypy/translator/stm/src_stm/rpyintf.c @@ -123,7 +123,9 @@ void **volatile v_saved_value; long volatile v_atomic = thread_descriptor->atomic; assert((!thread_descriptor->active) == (!v_atomic)); +#ifndef USING_BOEHM_GC v_saved_value = *(void***)save_and_restore; +#endif /***/ setjmp(_jmpbuf); /* After setjmp(), the local variables v_* are preserved because they @@ -133,6 +135,7 @@ void **restore_value; counter = v_counter; d->atomic = v_atomic; +#ifndef USING_BOEHM_GC restore_value = v_saved_value; if (!d->atomic) { @@ -143,6 +146,7 @@ *restore_value++ = END_MARKER; } *(void***)save_and_restore = restore_value; +#endif do { @@ -169,7 +173,9 @@ if (d->atomic && d->setjmp_buf == &_jmpbuf) BecomeInevitable("perform_transaction left with atomic"); +#ifndef USING_BOEHM_GC *(void***)save_and_restore = v_saved_value; +#endif } void stm_abort_and_retry(void) @@ -181,32 +187,47 @@ static __thread gcptr stm_boehm_chained_list; void stm_boehm_start_transaction(void) { + GC_init(); stm_boehm_chained_list = NULL; } -void stm_boehm_allocated(gcptr W) +gcptr stm_boehm_allocate(size_t size) { + gcptr W = GC_local_malloc(size); + memset((void*) W, 0, size); + W->h_size = size; W->h_revision = (revision_t)stm_boehm_chained_list; stm_boehm_chained_list = W; + return W; } void stm_boehm_stop_transaction(void) { + struct gcroot_s *gcroots; gcptr W = stm_boehm_chained_list; stm_boehm_chained_list = NULL; while (W) { gcptr W_next = (gcptr)W->h_revision; - assert(W->h_tid & (GCFLAG_GLOBAL | - GCFLAG_NOT_WRITTEN | - GCFLAG_LOCAL_COPY) == 0); + assert((W->h_tid & (GCFLAG_GLOBAL | + GCFLAG_NOT_WRITTEN | + GCFLAG_LOCAL_COPY)) == 0); W->h_tid |= GCFLAG_GLOBAL | GCFLAG_NOT_WRITTEN; W->h_revision = 1; W = W_next; } - FindRootsForLocalCollect(); + + gcroots = FindRootsForLocalCollect(); + while (gcroots->R != NULL) { + W = gcroots->L; + assert((W->h_tid & (GCFLAG_GLOBAL | + GCFLAG_NOT_WRITTEN | + GCFLAG_LOCAL_COPY)) == GCFLAG_LOCAL_COPY); + W->h_tid |= GCFLAG_GLOBAL | GCFLAG_NOT_WRITTEN; + gcroots++; + } } void *pypy_g__stm_duplicate(void *src) { - size_t size = GC_size(src); - void *result = GC_MALLOC(size); + size_t size = ((gcptr)src)->h_size; + void *result = GC_local_malloc(size); memcpy(result, src, size); return result; } _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit