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

Reply via email to