Author: Remi Meier <meier...@student.ethz.ch>
Branch: 
Changeset: r284:7b5404748520
Date: 2013-06-25 18:15 +0200
http://bitbucket.org/pypy/stmgc/changeset/7b5404748520/

Log:    break the huge switch in demo_random

diff --git a/c4/demo_random.c b/c4/demo_random.c
--- a/c4/demo_random.c
+++ b/c4/demo_random.c
@@ -274,93 +274,97 @@
 
 }
 
-gcptr do_step(gcptr p)
+gcptr rare_events(gcptr p, gcptr _r, gcptr _sr)
 {
-    nodeptr w_r, w_sr, w_t;
-    gcptr _r, _sr, _t;
-    int num, k;
+    int k = get_rand(10);
+    if (k == 1) {
+        push_roots();
+        stm_push_root(p);
+        stm_become_inevitable("fun");
+        p = stm_pop_root();
+        pop_roots();
+    } 
+    else if (k < 4) {
+        push_roots();
+        stmgc_minor_collect();
+        pop_roots();
+        p = NULL;
+    }
+    return p;
+}
 
-    _t = NULL;
-    num = get_rand(td.num_roots);
-    _r = td.roots[num];
-    
-    num = get_rand(SHARED_ROOTS);
-    _sr = shared_roots[num];
-
-    k = get_rand(19);
-    check(p);
-
+gcptr simple_events(gcptr p, gcptr _r, gcptr _sr)
+{
+    nodeptr w_r;
+    int k = get_rand(8);
+    int num = get_rand(td.num_roots);
     switch (k) {
     case 0: // remove a root
         if (num > 0)
             del_root(num);
         break;
-    case 1: // set 'p' to point to a root
+    case 1: // add 'p' to roots
+        if (p && td.num_roots < MAXROOTS)
+            td.roots[td.num_roots++] = p;
+        break;
+    case 2: // set 'p' to point to a root
         if (_r)
             p = _r;
         break;
-    case 2: // add 'p' to roots
-        if (p && td.num_roots < MAXROOTS)
-            td.roots[td.num_roots++] = p;
-        break;
     case 3: // allocate fresh 'p'
         p = (gcptr)allocate_node();
         break;
-    case 4: // set 'p' as *next in one of the roots
+    case 4:  // read and validate 'p'
+        p = read_barrier(p);
+        break;
+    case 5: // only do a stm_write_barrier
+        p = write_barrier(p);
+        break;
+    case 6: // follow p->next
+        if (p)
+            p = (gcptr)(((nodeptr)read_barrier(p))->next);
+        break;
+    case 7: // set 'p' as *next in one of the roots
         check(_r);
         w_r = (nodeptr)write_barrier(_r);
         check((gcptr)w_r);
         check(p);
         w_r->next = (struct node*)p;
         break;
-    case 5:  // read and validate 'p'
-        read_barrier(p);
-        break;
-    case 6: // transaction break
-        if (td.interruptible)
-            return (gcptr)-1; // break current
-        transaction_break();
-        p = NULL;
-        break;
-    case 7: // only do a stm_write_barrier
-        p = write_barrier(p);
-        break;
-    case 8:
-        if (p)
-            p = (gcptr)(((nodeptr)read_barrier(p))->next);
-        break;
-    case 9: // XXX: rare events
-        k = get_rand(10);
-        if (k == 1) {
-            push_roots();
-            stm_push_root(p);
-            stm_become_inevitable("fun");
-            p = stm_pop_root();
-            pop_roots();
-        }
-        break;
-    case 10: // only do a stm_read_barrier
-        p = read_barrier(p);
-        break;
-    case 11:
+    }
+    return p;
+}
+
+gcptr shared_roots_events(gcptr p, gcptr _r, gcptr _sr)
+{
+    nodeptr w_sr;
+
+    int k = get_rand(3);
+    switch (k) {
+    case 0: // read_barrier on shared root
         read_barrier(_sr);
         break;
-    case 12:
+    case 1: // write_barrier on shared root
         write_barrier(_sr);
         break;
-    case 13:
+    case 2:
         w_sr = (nodeptr)write_barrier(_sr);
         w_sr->next = (nodeptr)shared_roots[get_rand(SHARED_ROOTS)];
         break;
-    case 14:
-        push_roots();
-        stmgc_minor_collect();
-        pop_roots();
-        p = NULL;
-        break;
-    case 15: /* test stm_id on (non-)shared roots */
+    }
+    return p;
+}
+
+gcptr id_hash_events(gcptr p, gcptr _r, gcptr _sr)
+{
+    nodeptr w_t;
+    int k = get_rand(4);
+    gcptr _t = NULL;
+
+    switch (k) {
+    case 0: /* test stm_id on (non-)shared roots */
         _t = _r;
-    case 16:
+    case 1:
         if (!_t)
             _t = _sr;
         w_t = (nodeptr)read_barrier(_t);
@@ -374,9 +378,9 @@
             assert(w_t->id == stm_id((gcptr)_t));
         }
         break;
-    case 17: /* test stm_hash on (non-)shared roots */
+    case 2: /* test stm_hash on (non-)shared roots */
         _t = _r;
-    case 18:
+    case 3:
         if (!_t)
             _t = _sr;
         w_t = (nodeptr)read_barrier(_t);
@@ -400,6 +404,40 @@
 }
 
 
+
+gcptr do_step(gcptr p)
+{
+    gcptr _r, _sr;
+    int num, k;
+
+    num = get_rand(td.num_roots);
+    _r = td.roots[num];
+    
+    num = get_rand(SHARED_ROOTS);
+    _sr = shared_roots[num];
+
+    k = get_rand(9);
+    check(p);
+
+    if (k < 3)
+        p = simple_events(p, _r, _sr);
+    else if (k < 5)
+        p = shared_roots_events(p, _r, _sr);
+    else if (k < 7)
+        p = id_hash_events(p, _r, _sr);
+    else if (k < 8)
+        p = rare_events(p, _r, _sr);
+    else if (get_rand(3) == 1) {
+        // transaction break
+        if (td.interruptible)
+            return (gcptr)-1; // break current
+        transaction_break();
+        p = NULL;
+    }
+    return p;
+}
+
+
 void transaction_break()
 {
     push_roots();
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to