Author: Armin Rigo <ar...@tunes.org>
Branch: c7
Changeset: r634:28dac27037ba
Date: 2014-01-17 19:12 +0100
http://bitbucket.org/pypy/stmgc/changeset/28dac27037ba/

Log:    Bunch the swap_nodes

diff --git a/c7/core.c b/c7/core.c
--- a/c7/core.c
+++ b/c7/core.c
@@ -986,5 +986,6 @@
     assert(_STM_TL1->jmpbufptr != (jmpbufptr_t *)-1);   /* for tests only */
     _STM_TL2->running_transaction = 0;
     stm_stop_lock();
+    fprintf(stderr, "aborted\n");
     __builtin_longjmp(*_STM_TL1->jmpbufptr, 1);
 }
diff --git a/c7/demo2.c b/c7/demo2.c
--- a/c7/demo2.c
+++ b/c7/demo2.c
@@ -7,7 +7,8 @@
 #include "core.h"
 
 
-#define LIST_LENGTH 2000
+#define LIST_LENGTH 5000
+#define BUNCH       400
 
 typedef TLPREFIX struct node_s node_t;
 typedef node_t* nodeptr_t;
@@ -71,41 +72,49 @@
     goto back;
 }
 
-nodeptr_t swap_nodes(nodeptr_t prev)
+nodeptr_t swap_nodes(nodeptr_t initial)
 {
     jmpbufptr_t here;
 
-    assert(prev != NULL);
+    assert(initial != NULL);
  back:
     if (__builtin_setjmp(here) == 0) {
         stm_start_transaction(&here);
+        nodeptr_t prev = initial;
+        stm_read((objptr_t)prev);
         
-        stm_read((objptr_t)prev);
-        nodeptr_t current = prev->next;
-        if (current == NULL) {
-            stm_stop_transaction();
-            return NULL;
-        }
-        stm_read((objptr_t)current);
-        nodeptr_t next = current->next;
-        if (next == NULL) {
-            stm_stop_transaction();
-            return NULL;
-        }
-        stm_read((objptr_t)next);
-        
-        if (next->value < current->value) {
-            stm_write((objptr_t)prev);
-            stm_write((objptr_t)current);
-            stm_write((objptr_t)next);
+        int i;
+        for (i=0; i<BUNCH; i++) {
+            nodeptr_t current = prev->next;
+            if (current == NULL) {
+                stm_stop_transaction();
+                return NULL;
+            }
+            stm_read((objptr_t)current);
+            nodeptr_t next = current->next;
+            if (next == NULL) {
+                stm_stop_transaction();
+                return NULL;
+            }
+            stm_read((objptr_t)next);
             
-            prev->next = next;
-            current->next = next->next;
-            next->next = current;
+            if (next->value < current->value) {
+                stm_write((objptr_t)prev);
+                stm_write((objptr_t)current);
+                stm_write((objptr_t)next);
+                
+                prev->next = next;
+                current->next = next->next;
+                next->next = current;
+
+                _stm_start_safe_point();
+                _stm_stop_safe_point();
+            }
+            prev = current;
         }
 
         stm_stop_transaction();
-        return current;
+        return prev;
     }
     goto back;
 }
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to