Author: Armin Rigo <[email protected]>
Branch: stm-thread
Changeset: r54917:80298dd8e25e
Date: 2012-05-06 21:58 +0200
http://bitbucket.org/pypy/pypy/changeset/80298dd8e25e/
Log: Easy performance improvement.
diff --git a/pypy/rlib/rstm.py b/pypy/rlib/rstm.py
--- a/pypy/rlib/rstm.py
+++ b/pypy/rlib/rstm.py
@@ -49,9 +49,10 @@
llarg = rffi.cast(rclass.OBJECTPTR, llarg)
arg = cast_base_ptr_to_instance(argcls, llarg)
try:
- func(arg, retry_counter)
+ res = func(arg, retry_counter)
finally:
llop.stm_stop_transaction(lltype.Void)
+ return res
return _stm_callback
@specialize.arg(0, 1)
diff --git a/pypy/translator/stm/src_stm/core.c
b/pypy/translator/stm/src_stm/core.c
--- a/pypy/translator/stm/src_stm/core.c
+++ b/pypy/translator/stm/src_stm/core.c
@@ -742,12 +742,12 @@
return is_inevitable(d);
}
-void stm_perform_transaction(void(*callback)(void*, long), void *arg,
+void stm_perform_transaction(long(*callback)(void*, long), void *arg,
void *save_and_restore)
{
jmp_buf _jmpbuf;
long volatile v_counter = 0;
- long counter;
+ long counter, result;
void *volatile saved_value;
struct tx_descriptor *d = thread_descriptor;
assert(d->active == 0);
@@ -755,12 +755,18 @@
/***/
setjmp(_jmpbuf);
/***/
- *(void**)save_and_restore = saved_value;
- begin_transaction(&_jmpbuf);
- counter = v_counter;
- v_counter = counter + 1;
- callback(arg, counter);
- stm_commit_transaction();
+ while (1)
+ {
+ *(void**)save_and_restore = saved_value;
+ begin_transaction(&_jmpbuf);
+ counter = v_counter;
+ v_counter = counter + 1;
+ result = callback(arg, counter);
+ stm_commit_transaction();
+ if (result != 1) /* also when it raises an RPython exception */
+ return;
+ v_counter = 0;
+ }
}
#undef GETVERSION
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
@@ -30,7 +30,7 @@
long stm_in_transaction(void);
long stm_is_inevitable(void);
-void stm_perform_transaction(void(*)(void*, long), void*, void*);
+void stm_perform_transaction(long(*)(void*, long), void*, void*);
/* these functions are declared by generated C code from pypy.rlib.rstm
and from the GC (see llop.nop(...)) */
diff --git a/pypy/translator/stm/stmgcintf.py b/pypy/translator/stm/stmgcintf.py
--- a/pypy/translator/stm/stmgcintf.py
+++ b/pypy/translator/stm/stmgcintf.py
@@ -36,7 +36,7 @@
INIT_DONE = lltype.Ptr(lltype.FuncType([], lltype.Void))
CALLBACK_TX = lltype.Ptr(lltype.FuncType([rffi.VOIDP, lltype.Signed],
- lltype.Void))
+ lltype.Signed))
GETSIZE = lltype.Ptr(lltype.FuncType([llmemory.Address],
lltype.Signed))
CALLBACK_ENUM = lltype.Ptr(lltype.FuncType([llmemory.Address]*3,
diff --git a/pypy/translator/stm/test/targetdemo2.py
b/pypy/translator/stm/test/targetdemo2.py
--- a/pypy/translator/stm/test/targetdemo2.py
+++ b/pypy/translator/stm/test/targetdemo2.py
@@ -63,15 +63,16 @@
def run(self):
try:
- for value in range(glob.LENGTH):
- self.value = value
- rstm.perform_transaction(ThreadRunner.run_really,
- ThreadRunner, self)
+ self.value = 0
+ rstm.perform_transaction(ThreadRunner.run_really,
+ ThreadRunner, self)
finally:
self.finished_lock.release()
def run_really(self, retry_counter):
add_at_end_of_chained_list(glob.anchor, self.value, self.index)
+ self.value += 1
+ return int(self.value < glob.LENGTH)
# ____________________________________________________________
# bah, we are really missing an RPython interface to threads
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit