Author: Remi Meier <meier...@student.ethz.ch>
Branch: 
Changeset: r196:8d3cf9f0c450
Date: 2013-06-19 14:48 +0200
http://bitbucket.org/pypy/stmgc/changeset/8d3cf9f0c450/

Log:    demo_random: thread locals -> thread descriptor

diff --git a/c4/demo_random.c b/c4/demo_random.c
--- a/c4/demo_random.c
+++ b/c4/demo_random.c
@@ -40,29 +40,33 @@
     visit((gcptr *)&n->next);
 }
 
+
 // global and per-thread-data
 time_t default_seed;
 gcptr shared_roots[SHARED_ROOTS];
-__thread unsigned int thread_seed = 0;
-__thread gcptr roots[MAXROOTS];
-__thread gcptr roots_outside_perform[MAXROOTS];
-__thread gcptr current_root = 0;
-__thread int num_roots = 0;
-__thread int num_roots_outside_perform = 0;
-__thread int steps_left;
-__thread int interruptible = 0;
+struct thread_data {
+    unsigned int thread_seed;
+    gcptr roots[MAXROOTS];
+    gcptr roots_outside_perform[MAXROOTS];
+    gcptr current_root;
+    int num_roots;
+    int num_roots_outside_perform;
+    int steps_left;
+    int interruptible;
+};
+__thread struct thread_data td;
 
 
 // helper functions
 int get_rand(int max)
 {
-    return (int)(rand_r(&thread_seed) % (unsigned int)max);
+    return (int)(rand_r(&td.thread_seed) % (unsigned int)max);
 }
 
-void copy_roots(gcptr *from, gcptr *to)
+void copy_roots(gcptr *from, gcptr *to, int num)
 {
     int i;
-    for (i = 0; i < num_roots; i++)
+    for (i = 0; i < num; i++)
         *(to++) = *(from++);
 }
 
@@ -77,22 +81,22 @@
 void push_roots()
 {
     int i;
-    for (i = 0; i < num_roots; i++)
-        stm_push_root(roots[i]);
+    for (i = 0; i < td.num_roots; i++)
+        stm_push_root(td.roots[i]);
 }
 
 void pop_roots()
 {
     int i;
-    for (i = num_roots - 1; i >= 0; i--)
-        roots[i] = stm_pop_root();
+    for (i = td.num_roots - 1; i >= 0; i--)
+        td.roots[i] = stm_pop_root();
 }
 
 void del_root(int idx)
 {
     int i;
-    for (i = idx; i < num_roots - 1; i++)
-        roots[i] = roots[i + 1];
+    for (i = idx; i < td.num_roots - 1; i++)
+        td.roots[i] = td.roots[i + 1];
 }
 
 gcptr allocate_root(size_t size, int tid)
@@ -114,17 +118,17 @@
 void setup_thread()
 {
     int i;
-    thread_seed = default_seed;
-    steps_left = STEPS;
-    interruptible = 0;
+    td.thread_seed = default_seed;
+    td.steps_left = STEPS;
+    td.interruptible = 0;
     
-    num_roots = PREBUILT + NUMROOTS;
+    td.num_roots = PREBUILT + NUMROOTS;
     for (i = 0; i < PREBUILT; i++) {
-        roots[i] = allocate_pseudoprebuilt(sizeof(struct root), 
-                                           GCTID_STRUCT_ROOT);
+        td.roots[i] = allocate_pseudoprebuilt(sizeof(struct root), 
+                                              GCTID_STRUCT_ROOT);
     }
     for (i = PREBUILT; i < PREBUILT + NUMROOTS; i++) {
-        roots[i] = allocate_root(sizeof(struct root), GCTID_STRUCT_ROOT);
+        td.roots[i] = allocate_root(sizeof(struct root), GCTID_STRUCT_ROOT);
     }
 
 }
@@ -137,8 +141,8 @@
     gcptr _r, _sr;
     int num, k;
 
-    num = get_rand(num_roots);
-    _r = roots[num];
+    num = get_rand(td.num_roots);
+    _r = td.roots[num];
 
     num = get_rand(SHARED_ROOTS);
     _sr = shared_roots[num];
@@ -158,8 +162,8 @@
             p = _r;
         break;
     case 2: // add 'p' to roots
-        if (num_roots < MAXROOTS)
-            roots[num_roots++] = p;
+        if (td.num_roots < MAXROOTS)
+            td.roots[td.num_roots++] = p;
         break;
     case 3: // allocate fresh 'p'
         p = allocate_root(sizeof(struct root), GCTID_STRUCT_ROOT);
@@ -173,8 +177,8 @@
         stm_read_barrier(p);
         break;
     case 6: // transaction break
-        if (interruptible)
-            return -1; // break current
+        if (td.interruptible)
+            return (gcptr)-1; // break current
         transaction_break();
         p = NULL;
         break;
@@ -196,8 +200,8 @@
         stm_write_barrier(_sr);
         break;
     case 13:
-        w_sr = stm_write_barrier(_sr);
-        w_sr->next = shared_roots[get_rand(SHARED_ROOTS)];
+        w_sr = (rootptr)stm_write_barrier(_sr);
+        w_sr->next = (rootptr)shared_roots[get_rand(SHARED_ROOTS)];
     default:
         break;
     }
@@ -208,32 +212,32 @@
 void transaction_break()
 {
     push_roots();
-    interruptible = 1;
+    td.interruptible = 1;
     
-    copy_roots(roots, roots_outside_perform);
-    num_roots_outside_perform = num_roots;
+    copy_roots(td.roots, td.roots_outside_perform, td.num_roots);
+    td.num_roots_outside_perform = td.num_roots;
     
     stm_perform_transaction(NULL, interruptible_callback);
     
-    num_roots = num_roots_outside_perform;
-    copy_roots(roots_outside_perform, roots);
+    td.num_roots = td.num_roots_outside_perform;
+    copy_roots(td.roots_outside_perform, td.roots, td.num_roots);
     
-    interruptible = 0;
+    td.interruptible = 0;
     pop_roots();
 }
 
 
 int interruptible_callback(gcptr arg1, int retry_counter)
 {
-    num_roots = num_roots_outside_perform;
-    copy_roots(roots_outside_perform, roots);
+    td.num_roots = td.num_roots_outside_perform;
+    copy_roots(td.roots_outside_perform, td.roots, td.num_roots);
 
     arg1 = stm_pop_root();
     pop_roots();
     push_roots();
     stm_push_root(arg1);
 
-    gcptr p = run_me();
+    int p = run_me();
     int restart = p == -1 ? get_rand(3) != 1 : 0;
 
     return restart;
@@ -242,12 +246,12 @@
 int run_me()
 {
     gcptr p = NULL;
-    while (steps_left) {
-        steps_left--;
+    while (td.steps_left) {
+        td.steps_left--;
         p = do_step(p);
 
-        if (p == -1)
-            return p;
+        if (p == (gcptr)-1)
+            return -1;
     }
     return 0;
 }
@@ -258,7 +262,7 @@
 
 void *demo(void *arg)
 {  
-    int status, i;
+    int status;
     
     stm_initialize();
     setup_thread();
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to