Author: Armin Rigo <ar...@tunes.org> Branch: stm-thread-2 Changeset: r57177:9b410b19726d Date: 2012-09-06 16:10 +0200 http://bitbucket.org/pypy/pypy/changeset/9b410b19726d/
Log: Using gc=none instead of fighting Boehm. Now the test passes, slowly. diff --git a/pypy/rpython/memory/gctransform/boehmstm.py b/pypy/rpython/memory/gctransform/nogcstm.py rename from pypy/rpython/memory/gctransform/boehmstm.py rename to pypy/rpython/memory/gctransform/nogcstm.py --- a/pypy/rpython/memory/gctransform/boehmstm.py +++ b/pypy/rpython/memory/gctransform/nogcstm.py @@ -11,7 +11,7 @@ REV_INITIAL = r_uint(1) -class BoehmSTMGCTransformer(BoehmGCTransformer): +class NoneSTMGCTransformer(BoehmGCTransformer): HDR = lltype.Struct("header", ("hash", lltype.Signed), ("size", lltype.Signed), ("tid", lltype.Signed), # for flags only 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 @@ -199,9 +199,6 @@ class BoehmGcPolicy(BasicGcPolicy): def gettransformer(self): - if self.db.translator.config.translation.stm: - from pypy.rpython.memory.gctransform import boehmstm - return boehmstm.BoehmSTMGCTransformer(self.db.translator) from pypy.rpython.memory.gctransform import boehm return boehm.BoehmGCTransformer(self.db.translator) @@ -232,7 +229,7 @@ from pypy.rpython.tool.rffi_platform import configure_boehm eci = eci.merge(configure_boehm()) - pre_include_bits = ['#define USING_BOEHM_GC'] + pre_include_bits = [] if sys.platform.startswith('linux'): pre_include_bits += ["#define _REENTRANT 1", "#define GC_LINUX_THREADS 1"] @@ -242,6 +239,7 @@ eci = eci.merge(ExternalCompilationInfo( pre_include_bits=pre_include_bits, + post_include_bits=['#define USING_BOEHM_GC'], )) return eci @@ -306,10 +304,16 @@ gc_startup_code = RefcountingGcPolicy.gc_startup_code.im_func + def gettransformer(self): + if self.db.translator.config.translation.stm: + from pypy.rpython.memory.gctransform import nogcstm + return nogcstm.NoneSTMGCTransformer(self.db.translator) + return BoehmGcPolicy.gettransformer(self) + def compilation_info(self): eci = BasicGcPolicy.compilation_info(self) eci = eci.merge(ExternalCompilationInfo( - post_include_bits=['#define USING_NO_GC_AT_ALL'], + pre_include_bits=['#define USING_NO_GC_AT_ALL'], )) return eci 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,14 +178,11 @@ /* #define BOEHM_MALLOC_0_1 GC_MALLOC_IGNORE_OFF_PAGE */ /* #define BOEHM_MALLOC_1_1 GC_MALLOC_ATOMIC_IGNORE_OFF_PAGE */ -#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); \ } -#endif - #define OP_BOEHM_DISAPPEARING_LINK(link, obj, r) \ if (GC_base(obj) == NULL) \ ; /* 'obj' is probably a prebuilt object - it makes no */ \ @@ -236,8 +233,10 @@ #ifdef USING_NO_GC_AT_ALL +#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) calloc(1, size); +#endif #define OP_BOEHM_DISAPPEARING_LINK(link, obj, r) /* nothing */ #define OP_GC__DISABLE_FINALIZERS(r) /* nothing */ #define OP_GC__ENABLE_FINALIZERS(r) /* nothing */ 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 @@ -3,16 +3,16 @@ def stm_start_transaction(funcgen, op): - # only for Boehm. With stmgc, this operation should have been handled + # only for testing. With stmgc, this operation should have been handled # already by gctransform. - assert funcgen.db.translator.config.translation.gc == 'boehm' - return 'stm_boehm_start_transaction();' + assert funcgen.db.translator.config.translation.gc == 'none' + return 'stm_nogc_start_transaction();' def stm_stop_transaction(funcgen, op): - # only for Boehm. With stmgc, this operation should have been handled + # only for testing. With stmgc, this operation should have been handled # already by gctransform. - assert funcgen.db.translator.config.translation.gc == 'boehm' - return 'stm_boehm_stop_transaction();' + assert funcgen.db.translator.config.translation.gc == 'none' + return 'stm_nogc_stop_transaction();' def stm_barrier(funcgen, op): level = op.args[0].value 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 @@ -14,11 +14,12 @@ #ifndef _ET_H #define _ET_H +#include <stddef.h> #include <setjmp.h> /* These are partly the same flags as defined in stmgc.py, as well as - boehmstm.py. Keep in sync! */ + nogcstm.py. Keep in sync! */ enum { _first_gcflag = 1L << (PYPY_LONG_BIT / 2), GCFLAG_GLOBAL = _first_gcflag << 0, @@ -109,14 +110,14 @@ void *save_and_restore); void stm_abort_and_retry(void); -#ifdef USING_BOEHM_GC +#ifdef USING_NO_GC_AT_ALL # define OP_GC_ADR_OF_ROOT_STACK_TOP(r) r = NULL -void stm_boehm_start_transaction(void); -void stm_boehm_stop_transaction(void); -gcptr stm_boehm_allocate(size_t); +void stm_nogc_start_transaction(void); +void stm_nogc_stop_transaction(void); +gcptr stm_nogc_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) + r = (restype) stm_nogc_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,7 @@ void **volatile v_saved_value; long volatile v_atomic = thread_descriptor->atomic; assert((!thread_descriptor->active) == (!v_atomic)); -#ifndef USING_BOEHM_GC +#ifndef USING_NO_GC_AT_ALL v_saved_value = *(void***)save_and_restore; #endif /***/ @@ -135,7 +135,7 @@ void **restore_value; counter = v_counter; d->atomic = v_atomic; -#ifndef USING_BOEHM_GC +#ifndef USING_NO_GC_AT_ALL restore_value = v_saved_value; if (!d->atomic) { @@ -173,7 +173,7 @@ if (d->atomic && d->setjmp_buf == &_jmpbuf) BecomeInevitable("perform_transaction left with atomic"); -#ifndef USING_BOEHM_GC +#ifndef USING_NO_GC_AT_ALL *(void***)save_and_restore = v_saved_value; #endif } @@ -183,27 +183,29 @@ AbortTransaction(4); /* manual abort */ } -#ifdef USING_BOEHM_GC -static __thread gcptr stm_boehm_chained_list; -void stm_boehm_start_transaction(void) +#ifdef USING_NO_GC_AT_ALL +static __thread gcptr stm_nogc_chained_list; +void stm_nogc_start_transaction(void) { - GC_init(); - stm_boehm_chained_list = NULL; + stm_nogc_chained_list = NULL; } -gcptr stm_boehm_allocate(size_t size) +gcptr stm_nogc_allocate(size_t size) { - gcptr W = GC_local_malloc(size); - memset((void*) W, 0, size); + gcptr W = calloc(1, size); + if (!W) { + fprintf(stderr, "out of memory!\n"); + abort(); + } W->h_size = size; - W->h_revision = (revision_t)stm_boehm_chained_list; - stm_boehm_chained_list = W; + W->h_revision = (revision_t)stm_nogc_chained_list; + stm_nogc_chained_list = W; return W; } -void stm_boehm_stop_transaction(void) +void stm_nogc_stop_transaction(void) { struct gcroot_s *gcroots; - gcptr W = stm_boehm_chained_list; - stm_boehm_chained_list = NULL; + gcptr W = stm_nogc_chained_list; + stm_nogc_chained_list = NULL; while (W) { gcptr W_next = (gcptr)W->h_revision; assert((W->h_tid & (GCFLAG_GLOBAL | @@ -227,7 +229,11 @@ void *pypy_g__stm_duplicate(void *src) { size_t size = ((gcptr)src)->h_size; - void *result = GC_local_malloc(size); + void *result = malloc(size); + if (!result) { + fprintf(stderr, "out of memory!\n"); + abort(); + } memcpy(result, src, size); return result; } diff --git a/pypy/translator/stm/test/support.py b/pypy/translator/stm/test/support.py --- a/pypy/translator/stm/test/support.py +++ b/pypy/translator/stm/test/support.py @@ -24,5 +24,5 @@ return res -class BoehmCompiledSTMTests(CompiledSTMTests): - gc = "boehm" +class NoGcCompiledSTMTests(CompiledSTMTests): + gc = "none" diff --git a/pypy/translator/stm/test/test_ztranslated.py b/pypy/translator/stm/test/test_ztranslated.py --- a/pypy/translator/stm/test/test_ztranslated.py +++ b/pypy/translator/stm/test/test_ztranslated.py @@ -1,15 +1,14 @@ import py from pypy.rlib import rstm, rgc -from pypy.translator.stm.test.support import BoehmCompiledSTMTests +from pypy.translator.stm.test.support import NoGcCompiledSTMTests from pypy.translator.stm.test.support import CompiledSTMTests from pypy.translator.stm.test import targetdemo2 -class TestBoehmSTMTranslated(BoehmCompiledSTMTests): +class TestNoGcSTMTranslated(NoGcCompiledSTMTests): def test_targetdemo(self): t, cbuilder = self.compile(targetdemo2.entry_point) - data, dataerr = cbuilder.cmdexec('4 5000', err=True, - env={'PYPY_GC_DEBUG': '1'}) + data, dataerr = cbuilder.cmdexec('4 100', err=True) assert 'check ok!' in data _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit