879 |
|
* Unlinks matched nodes encountered in a traversal from head. |
880 |
|
*/ |
881 |
|
private void sweep() { |
882 |
< |
Node p = head, s, n; |
883 |
< |
while (p != null && (s = p.next) != null && (n = s.next) != null) { |
884 |
< |
if (p == s || s == n) |
885 |
< |
p = head; // stale |
886 |
< |
else if (s.isMatched()) |
887 |
< |
p.casNext(s, n); |
888 |
< |
else |
882 |
> |
for (Node p = head, s, n; p != null && (s = p.next) != null; ) { |
883 |
> |
if (p == s) // stale |
884 |
> |
p = head; |
885 |
> |
else if (!s.isMatched()) |
886 |
|
p = s; |
887 |
+ |
else if ((n = s.next) == null) // trailing node is pinned |
888 |
+ |
break; |
889 |
+ |
else |
890 |
+ |
p.casNext(s, n); |
891 |
|
} |
892 |
|
} |
893 |
|
|