Author: Armin Rigo <ar...@tunes.org> Branch: Changeset: r324:59eb9a85c3d1 Date: 2013-06-30 19:48 +0200 http://bitbucket.org/pypy/stmgc/changeset/59eb9a85c3d1/
Log: stm_atomic(). diff --git a/c4/et.c b/c4/et.c --- a/c4/et.c +++ b/c4/et.c @@ -903,6 +903,15 @@ d->reads_size_limit = d->atomic ? ULONG_MAX : d->reads_size_limit_nonatomic; } +long stm_atomic(long delta) +{ + struct tx_descriptor *d = thread_descriptor; + d->atomic += delta; + assert(d->atomic >= 0); + update_reads_size_limit(d); + return d->atomic; +} + static void init_transaction(struct tx_descriptor *d) { assert(d->active == 0); diff --git a/c4/stmgc.h b/c4/stmgc.h --- a/c4/stmgc.h +++ b/c4/stmgc.h @@ -77,6 +77,13 @@ void stm_set_transaction_length(long length_max); _Bool stm_should_break_transaction(void); +/* change the atomic counter by 'delta' and return the new value. Used + with +1 to enter or with -1 to leave atomic mode, or with 0 to just + know the current value of the counter. The current transaction is + *never* interrupted as long as this counter is positive. */ +long stm_atomic(long delta); + + /* callback: get the size of an object */ extern size_t stmcb_size(gcptr); diff --git a/c4/test/support.py b/c4/test/support.py --- a/c4/test/support.py +++ b/c4/test/support.py @@ -62,6 +62,7 @@ void stm_begin_inevitable_transaction(void); void stm_set_transaction_length(long length_max); _Bool stm_should_break_transaction(void); + long stm_atomic(long delta); /* extra non-public code */ void printfcolor(char *msg); diff --git a/c4/test/test_atomic.py b/c4/test/test_atomic.py --- a/c4/test/test_atomic.py +++ b/c4/test/test_atomic.py @@ -31,3 +31,28 @@ should_br[i + 1] = should_break_transaction() # assert should_br == [False, False, False, False, True, True, True] + +def test_stm_atomic(): + assert lib.stm_atomic(0) == 0 + x = lib.stm_atomic(+1) + assert x == 1 + x = lib.stm_atomic(+1) + assert x == 2 + x = lib.stm_atomic(-1) + assert x == 1 + x = lib.stm_atomic(0) + assert x == 1 + x = lib.stm_atomic(-1) + assert x == 0 + +def test_transaction_atomic_mode(): + assert lib.stm_in_transaction() + lib.stm_commit_transaction() + assert not lib.stm_in_transaction() + lib.stm_begin_inevitable_transaction() + assert lib.stm_in_transaction() + lib.stm_atomic(+1) + lib.stm_commit_transaction() + assert lib.stm_in_transaction() + lib.stm_begin_inevitable_transaction() + lib.stm_atomic(-1) _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit