1179 |
|
} |
1180 |
|
|
1181 |
|
/** |
1182 |
– |
* Main implementation of remove(Object) |
1183 |
– |
*/ |
1184 |
– |
private boolean findAndRemove(Object e) { |
1185 |
– |
if (e != null) { |
1186 |
– |
for (Node pred = null, p = head; p != null; ) { |
1187 |
– |
Object item = p.item; |
1188 |
– |
if (p.isData) { |
1189 |
– |
if (item != null && e.equals(item) && |
1190 |
– |
p.tryMatchData()) { |
1191 |
– |
unsplice(pred, p); |
1192 |
– |
return true; |
1193 |
– |
} |
1194 |
– |
} |
1195 |
– |
else if (item == null) |
1196 |
– |
break; |
1197 |
– |
pred = p; |
1198 |
– |
if ((p = p.next) == pred) { // stale |
1199 |
– |
pred = null; |
1200 |
– |
p = head; |
1201 |
– |
} |
1202 |
– |
} |
1203 |
– |
} |
1204 |
– |
return false; |
1205 |
– |
} |
1206 |
– |
|
1207 |
– |
/** |
1182 |
|
* Creates an initially empty {@code LinkedTransferQueue}. |
1183 |
|
*/ |
1184 |
|
public LinkedTransferQueue() { |
1446 |
|
* @return {@code true} if this queue changed as a result of the call |
1447 |
|
*/ |
1448 |
|
public boolean remove(Object o) { |
1449 |
< |
return findAndRemove(o); |
1449 |
> |
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 |
|
/** |