Reverted my patch and applied Doug Lea's patch
This commit is contained in:
parent
3b5c36782d
commit
90045fd487
@ -301,12 +301,9 @@ public class LinkedTransferQueue<E> extends AbstractQueue<E> implements Blocking
|
|||||||
advanceHead(pred, s); // unlink if head
|
advanceHead(pred, s); // unlink if head
|
||||||
if (x == s) {
|
if (x == s) {
|
||||||
return clean(pred, s);
|
return clean(pred, s);
|
||||||
} else if (x != null) {
|
|
||||||
s.set(s); // avoid garbage retention
|
|
||||||
return x;
|
|
||||||
} else {
|
|
||||||
return e;
|
|
||||||
}
|
}
|
||||||
|
s.set(s); // mark as off-list
|
||||||
|
return x != null? x : e;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mode == TIMEOUT) {
|
if (mode == TIMEOUT) {
|
||||||
@ -356,7 +353,6 @@ public class LinkedTransferQueue<E> extends AbstractQueue<E> implements Blocking
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QNode olddp = UNDEFINED;
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
if (pred.next != s) {
|
if (pred.next != s) {
|
||||||
return null;
|
return null;
|
||||||
@ -386,7 +382,6 @@ public class LinkedTransferQueue<E> extends AbstractQueue<E> implements Blocking
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean stateUnchanged = true;
|
|
||||||
QNode dp = cleanMe.get();
|
QNode dp = cleanMe.get();
|
||||||
if (dp != null) { // Try unlinking previous cancelled node
|
if (dp != null) { // Try unlinking previous cancelled node
|
||||||
QNode d = dp.next;
|
QNode d = dp.next;
|
||||||
@ -399,17 +394,10 @@ public class LinkedTransferQueue<E> extends AbstractQueue<E> implements Blocking
|
|||||||
dn != d && // that is on list
|
dn != d && // that is on list
|
||||||
dp.casNext(d, dn)) {
|
dp.casNext(d, dn)) {
|
||||||
cleanMe.compareAndSet(dp, null);
|
cleanMe.compareAndSet(dp, null);
|
||||||
stateUnchanged = false;
|
|
||||||
}
|
}
|
||||||
if (dp == pred) {
|
if (dp == pred) {
|
||||||
return null; // s is already saved node
|
return null; // s is already saved node
|
||||||
}
|
}
|
||||||
|
|
||||||
if (stateUnchanged && olddp == dp) {
|
|
||||||
return null; // infinite loop expected - bail out
|
|
||||||
} else {
|
|
||||||
olddp = dp;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if (cleanMe.compareAndSet(null, pred)) {
|
else if (cleanMe.compareAndSet(null, pred)) {
|
||||||
return null; // Postpone cleaning s
|
return null; // Postpone cleaning s
|
||||||
|
Loading…
Reference in New Issue
Block a user