1179 |
} |
} |
1180 |
|
|
1181 |
/** |
/** |
|
* Main implementation of remove(Object) |
|
|
*/ |
|
|
private boolean findAndRemove(Object e) { |
|
|
if (e != null) { |
|
|
for (Node pred = null, p = head; p != null; ) { |
|
|
Object item = p.item; |
|
|
if (p.isData) { |
|
|
if (item != null && e.equals(item) && |
|
|
p.tryMatchData()) { |
|
|
unsplice(pred, p); |
|
|
return true; |
|
|
} |
|
|
} |
|
|
else if (item == null) |
|
|
break; |
|
|
pred = p; |
|
|
if ((p = p.next) == pred) { // stale |
|
|
pred = null; |
|
|
p = head; |
|
|
} |
|
|
} |
|
|
} |
|
|
return false; |
|
|
} |
|
|
|
|
|
/** |
|
1182 |
* Creates an initially empty {@code LinkedTransferQueue}. |
* Creates an initially empty {@code LinkedTransferQueue}. |
1183 |
*/ |
*/ |
1184 |
public LinkedTransferQueue() { |
public LinkedTransferQueue() { |
1446 |
* @return {@code true} if this queue changed as a result of the call |
* @return {@code true} if this queue changed as a result of the call |
1447 |
*/ |
*/ |
1448 |
public boolean remove(Object o) { |
public boolean remove(Object o) { |
1449 |
return findAndRemove(o); |
if (o == null) |
1450 |
|
return false; |
1451 |
|
restartFromHead: for (;;) { |
1452 |
|
for (Node pred = null, p = head; p != null; ) { |
1453 |
|
Object item = p.item; |
1454 |
|
if (p.isData) { |
1455 |
|
if (item != null |
1456 |
|
&& o.equals(item) |
1457 |
|
&& p.tryMatchData()) { |
1458 |
|
unsplice(pred, p); |
1459 |
|
return true; |
1460 |
|
} |
1461 |
|
} |
1462 |
|
else if (item == null) |
1463 |
|
break; |
1464 |
|
if ((pred = p) == (p = p.next)) |
1465 |
|
continue restartFromHead; |
1466 |
|
} |
1467 |
|
return false; |
1468 |
|
} |
1469 |
} |
} |
1470 |
|
|
1471 |
/** |
/** |