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.*; |
57 |
|
pool.invoke(new Driver(root)); |
58 |
|
long elapsed = System.nanoTime() - start; |
59 |
|
double nanosPerEdge = (double) elapsed / (4 * n); |
60 |
< |
System.out.printf(" %7.2f", nanosPerEdge); |
60 |
> |
System.out.printf(" %7.2f", nanosPerEdge); |
61 |
|
if (!checked) { |
62 |
|
checked = true; |
63 |
|
checkSpanningTree(graph, root); |
64 |
|
} |
65 |
|
pool.invoke(new Resetter(graph, 0, graph.length)); |
66 |
|
} |
67 |
+ |
graph = null; |
68 |
|
System.out.println(); |
69 |
|
} |
70 |
|
System.out.println(pool); |
75 |
|
final Node[] neighbors; |
76 |
|
Node parent; |
77 |
|
Node next; |
77 |
– |
volatile int mark; |
78 |
|
|
79 |
|
Node(Node[] nbrs) { |
80 |
|
neighbors = nbrs; |
81 |
|
parent = this; |
82 |
|
} |
83 |
|
|
84 |
– |
static final AtomicIntegerFieldUpdater<Node> markUpdater = |
85 |
– |
AtomicIntegerFieldUpdater.newUpdater(Node.class, "mark"); |
86 |
– |
|
87 |
– |
boolean tryMark() { |
88 |
– |
return mark == 0 && markUpdater.compareAndSet(this, 0, 1); |
89 |
– |
} |
90 |
– |
void setMark() { mark = 1; } |
91 |
– |
|
84 |
|
/* |
85 |
|
* Traverse the list ("oldList") embedded across .next fields, |
86 |
|
* starting at this node, placing newly discovered neighboring |
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; |
148 |
|
reinitialize(); |
149 |
|
parent = this; |
150 |
|
next = null; |
158 |
– |
mark = 0; |
151 |
|
} |
152 |
|
|
153 |
|
} |
158 |
|
this.root = root; |
159 |
|
} |
160 |
|
public void compute() { |
161 |
< |
root.setMark(); |
161 |
> |
root.setForkJoinTaskTag((short)1); |
162 |
|
root.fork(); |
163 |
|
helpQuiesce(); |
164 |
|
} |