ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/loops/TorusSpanningTree.java
(Generate patch)

Comparing jsr166/src/test/loops/TorusSpanningTree.java (file contents):
Revision 1.5 by jsr166, Wed Sep 1 07:20:36 2010 UTC vs.
Revision 1.9 by dl, Sat Sep 12 20:24:33 2015 UTC

# Line 1 | Line 1
1   /*
2   * Written by Doug Lea with assistance from members of JCP JSR-166
3   * Expert Group and released to the public domain, as explained at
4 < * http://creativecommons.org/licenses/publicdomain
4 > * http://creativecommons.org/publicdomain/zero/1.0/
5   */
6  
7   //import jsr166y.*;
# Line 46 | Line 46 | public class TorusSpanningTree {
46                            MIN_SIDE, MAX_SIDE, SIDE_STEP);
47          ForkJoinPool pool = new ForkJoinPool(procs);
48  
49 +        boolean checked = false;
50          for (int side = MIN_SIDE; side <= MAX_SIDE; side += SIDE_STEP) {
51              int n = side * side;
52              Node[] graph = makeGraph(side);
# Line 57 | Line 58 | public class TorusSpanningTree {
58                  long elapsed = System.nanoTime() - start;
59                  double nanosPerEdge = (double) elapsed / (4 * n);
60                  System.out.printf(" %7.2f", nanosPerEdge);
61 <                if (j == 0)
61 >                if (!checked) {
62 >                    checked = true;
63                      checkSpanningTree(graph, root);
64 <                resetAll(graph);
64 >                }
65 >                pool.invoke(new Resetter(graph, 0, graph.length));
66              }
67 +            graph = null;
68              System.out.println();
69          }
70 +        System.out.println(pool);
71          pool.shutdown();
72      }
73  
# Line 70 | Line 75 | public class TorusSpanningTree {
75          final Node[] neighbors;
76          Node parent;
77          Node next;
73        volatile int mark;
78  
79          Node(Node[] nbrs) {
80              neighbors = nbrs;
81              parent = this;
82          }
83  
80        static final AtomicIntegerFieldUpdater<Node> markUpdater =
81            AtomicIntegerFieldUpdater.newUpdater(Node.class, "mark");
82
83        boolean tryMark() {
84            return mark == 0 && markUpdater.compareAndSet(this, 0, 1);
85        }
86        void setMark() { mark = 1; }
87
84          /*
85           * Traverse the list ("oldList") embedded across .next fields,
86           * starting at this node, placing newly discovered neighboring
# Line 113 | Line 109 | public class TorusSpanningTree {
109                  int nedges = edges.length;
110                  for (int k = 0; k < nedges; ++k) {
111                      Node e = edges[k];
112 <                    if (e != null && e.tryMark()) {
112 >                    if (e != null &&
113 >                        e.compareAndSetForkJoinTaskTag((short)0, (short)1)) {
114                          e.parent = par;
115                          e.next = newList;
116                          newList = e;
# Line 151 | Line 148 | public class TorusSpanningTree {
148              reinitialize();
149              parent = this;
150              next = null;
154            mark = 0;
151          }
152  
153      }
# Line 162 | Line 158 | public class TorusSpanningTree {
158              this.root = root;
159          }
160          public void compute() {
161 <            root.setMark();
161 >            root.setForkJoinTaskTag((short)1);
162              root.fork();
163              helpQuiesce();
164          }
# Line 213 | Line 209 | public class TorusSpanningTree {
209          }
210      }
211  
212 +    static final class Resetter extends RecursiveAction {
213 +        final Node[] g;
214 +        final int lo, hi;
215 +        Resetter(Node[] g, int lo, int hi) {
216 +            this.g = g; this.lo = lo; this.hi = hi;
217 +        }
218 +        public void compute() {
219 +            int mid = (lo + hi) >>> 1;
220 +            if (mid == lo || getSurplusQueuedTaskCount() > 3) {
221 +                for (int i = lo; i < hi; ++i)
222 +                    g[i].reset();
223 +            }
224 +            else
225 +                invokeAll(new Resetter(g, lo, mid), new Resetter(g, mid, hi));
226 +        }
227 +    }
228   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines