[pypy-commit] pypy stm-gc: Tweaks
arigo
noreply at buildbot.pypy.org
Fri Feb 10 16:17:21 CET 2012
Author: Armin Rigo <arigo at tunes.org>
Branch: stm-gc
Changeset: r52354:e71b8bc58097
Date: 2012-02-10 15:39 +0100
http://bitbucket.org/pypy/pypy/changeset/e71b8bc58097/
Log: Tweaks
diff --git a/pypy/rlib/rstm.py b/pypy/rlib/rstm.py
--- a/pypy/rlib/rstm.py
+++ b/pypy/rlib/rstm.py
@@ -18,9 +18,11 @@
arg = cast_base_ptr_to_instance(argcls, llarg)
else:
arg = lltype.TLS.stm_callback_arg
- res = func(arg, retry_counter)
- assert res is None
- llop.stm_commit_transaction(lltype.Void)
+ try:
+ res = func(arg, retry_counter)
+ assert res is None
+ finally:
+ llop.stm_commit_transaction(lltype.Void)
return lltype.nullptr(rffi.VOIDP.TO)
return _stm_callback
diff --git a/pypy/rpython/memory/gc/stmgc.py b/pypy/rpython/memory/gc/stmgc.py
--- a/pypy/rpython/memory/gc/stmgc.py
+++ b/pypy/rpython/memory/gc/stmgc.py
@@ -119,7 +119,7 @@
if in_main_thread:
tls.malloc_flags = GCFLAG_GLOBAL
else:
- tls.malloc_flags = 0
+ tls.malloc_flags = -1 # don't malloc outside a transaction!
return tls
def _setup_secondary_thread(self):
@@ -172,6 +172,8 @@
# modes, but set different flags.
tls = self.collector.get_tls()
flags = tls.malloc_flags
+ ll_assert(flags != -1, "malloc() in a transactional thread but "
+ "outside a transaction")
#
# Get the memory from the nursery.
size_gc_header = self.gcheaderbuilder.size_gc_header
@@ -192,6 +194,8 @@
# XXX Be more subtle, e.g. detecting overflows, at least
tls = self.collector.get_tls()
flags = tls.malloc_flags
+ ll_assert(flags != -1, "malloc() in a transactional thread but "
+ "outside a transaction")
size_gc_header = self.gcheaderbuilder.size_gc_header
nonvarsize = size_gc_header + size
totalsize = nonvarsize + itemsize * length
@@ -350,10 +354,10 @@
# ----------
def acquire(self, lock):
- ll_thread.c_thread_acquirelock(lock, 1)
+ ll_thread.c_thread_acquirelock_NOAUTO(lock, 1)
def release(self, lock):
- ll_thread.c_thread_releaselock(lock)
+ ll_thread.c_thread_releaselock_NOAUTO(lock)
# ----------
@@ -392,6 +396,7 @@
"""Start a transaction, by clearing and resetting the tls nursery."""
tls = self.get_tls()
self.gc.reset_nursery(tls)
+ tls.malloc_flags = 0
def commit_transaction(self):
@@ -402,6 +407,7 @@
debug_start("gc-collect-commit")
#
tls = self.get_tls()
+ tls.malloc_flags = -1
#
# Do a mark-and-move minor collection out of the tls' nursery
# into the main thread's global area (which is right now also
diff --git a/pypy/translator/stm/test/targetdemo.py b/pypy/translator/stm/test/targetdemo.py
--- a/pypy/translator/stm/test/targetdemo.py
+++ b/pypy/translator/stm/test/targetdemo.py
@@ -17,10 +17,11 @@
glob = Global()
class Arg:
- _alloc_nonmovable_ = True
+ _alloc_nonmovable_ = True # XXX kill me
def add_at_end_of_chained_list(arg, retry_counter):
+ assert arg.foobar == 42
node = arg.anchor
value = arg.value
x = Node(value)
@@ -66,10 +67,14 @@
try:
debug_print("thread starting...")
arg = Arg()
- for i in range(glob.LENGTH):
+ arg.foobar = 41
+ i = 0
+ while i < glob.LENGTH:
arg.anchor = glob.anchor
arg.value = i
+ arg.foobar = 42
rstm.perform_transaction(add_at_end_of_chained_list, Arg, arg)
+ i += 1
rstm.perform_transaction(increment_done, Arg, arg)
finally:
rstm.descriptor_done()
More information about the pypy-commit
mailing list