428 |
|
} |
429 |
|
|
430 |
|
/** |
431 |
< |
* Creates a new node. Uses relaxed write because item can only |
432 |
< |
* be seen if followed by CAS. |
431 |
> |
* Constructs a new node. Uses relaxed write because item can |
432 |
> |
* only be seen after publication via casNext. |
433 |
|
*/ |
434 |
|
Node(Object item, boolean isData) { |
435 |
|
UNSAFE.putObject(this, itemOffset, item); // relaxed write |
877 |
|
} |
878 |
|
|
879 |
|
/** |
880 |
< |
* Unlinks matched nodes encountered in a traversal from head. |
880 |
> |
* Unlinks matched (typically cancelled) nodes encountered in a |
881 |
> |
* traversal from head. |
882 |
|
*/ |
883 |
|
private void sweep() { |
884 |
|
for (Node p = head, s, n; p != null && (s = p.next) != null; ) { |
886 |
|
p = head; |
887 |
|
else if (!s.isMatched()) |
888 |
|
p = s; |
889 |
< |
else if ((n = s.next) == null) // trailing node is pinned |
889 |
> |
else if ((n = s.next) == null || s == n) // trailing node is pinned |
890 |
|
break; |
891 |
|
else |
892 |
|
p.casNext(s, n); |