if (isData == haveData) // can't match break; if (p.casItem(item, e)) { // match for (Node q = p; q != h; ) { h.forgetNext(); break; (q = h.next) == null || !q.isMatched()) break; // unless slack < 2 s = new Node(e, haveData); Node pred = tryAppend(s, haveData); if (pred == null)
if (item != e) { // matched s.forgetContents(); // avoid garbage return LinkedTransferQueue.<E>cast(item); s.casItem(e, s)) { // cancel unsplice(pred, s); return e;
/** * 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 && item != p && 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; }
if (isData == haveData) // can't match break; if (p.casItem(item, e)) { // match for (Node q = p; q != h; ) { h.forgetNext(); break; (q = h.next) == null || !q.isMatched()) break; // unless slack < 2 s = new Node(e, haveData); Node pred = tryAppend(s, haveData); if (pred == null)
if (isData == haveData) // can't match break; if (p.casItem(item, e)) { // match for (Node q = p; q != h; ) { h.forgetNext(); break; (q = h.next) == null || !q.isMatched()) break; // unless slack < 2 s = new Node(e, haveData); Node pred = tryAppend(s, haveData); if (pred == null)
if (isData == haveData) // can't match break; if (p.casItem(item, e)) { // match for (Node q = p; q != h; ) { h.forgetNext(); break; (q = h.next) == null || !q.isMatched()) break; // unless slack < 2 s = new Node(e, haveData); Node pred = tryAppend(s, haveData); if (pred == null)
if (isData == haveData) // can't match break; if (p.casItem(item, e)) { // match for (Node q = p; q != h; ) { h.forgetNext(); break; (q = h.next) == null || !q.isMatched()) break; // unless slack < 2 s = new Node(e, haveData); Node pred = tryAppend(s, haveData); if (pred == null)
if (isData == haveData) // can't match break; if (p.casItem(item, e)) { // match for (Node q = p; q != h; ) { h.forgetNext(); break; (q = h.next) == null || !q.isMatched()) break; // unless slack < 2 s = new Node(e, haveData); Node pred = tryAppend(s, haveData); if (pred == null)
if (item != e) { // matched s.forgetContents(); // avoid garbage return LinkedTransferQueue.<E>cast(item); s.casItem(e, s)) { // cancel unsplice(pred, s); return e;
if (item != e) { // matched s.forgetContents(); // avoid garbage return LinkedTransferQueue.<E>cast(item); s.casItem(e, s)) { // cancel unsplice(pred, s); return e;
s.forgetContents(); // forget unneeded fields Node n = s.next; if (n == null || (n != s && pred.casNext(s, n) && pred.isMatched())) { for (; ; ) { // check if at, or could be, head Node h = head; if (h == pred || h == s || h == null) return; // at head or list empty if (!h.isMatched()) break; Node hn = h.next; return; // now empty if (hn != h && casHead(h, hn)) h.forgetNext(); // advance head
if (item != e) { // matched s.forgetContents(); // avoid garbage return LinkedTransferQueue.<E>cast(item); s.casItem(e, s)) { // cancel unsplice(pred, s); return e;
if (item != e) { // matched s.forgetContents(); // avoid garbage return LinkedTransferQueue.<E>cast(item); s.casItem(e, s)) { // cancel unsplice(pred, s); return e;
s.forgetContents(); // forget unneeded fields Node n = s.next; if (n == null || (n != s && pred.casNext(s, n) && pred.isMatched())) { for (; ; ) { // check if at, or could be, head Node h = head; if (h == pred || h == s || h == null) return; // at head or list empty if (!h.isMatched()) break; Node hn = h.next; return; // now empty if (hn != h && casHead(h, hn)) h.forgetNext(); // advance head
s.forgetContents(); // forget unneeded fields Node n = s.next; if (n == null || (n != s && pred.casNext(s, n) && pred.isMatched())) { for (; ; ) { // check if at, or could be, head Node h = head; if (h == pred || h == s || h == null) return; // at head or list empty if (!h.isMatched()) break; Node hn = h.next; return; // now empty if (hn != h && casHead(h, hn)) h.forgetNext(); // advance head
s.forgetContents(); // forget unneeded fields Node n = s.next; if (n == null || (n != s && pred.casNext(s, n) && pred.isMatched())) { for (; ; ) { // check if at, or could be, head Node h = head; if (h == pred || h == s || h == null) return; // at head or list empty if (!h.isMatched()) break; Node hn = h.next; return; // now empty if (hn != h && casHead(h, hn)) h.forgetNext(); // advance head
s.forgetContents(); // forget unneeded fields Node n = s.next; if (n == null || (n != s && pred.casNext(s, n) && pred.isMatched())) { for (; ; ) { // check if at, or could be, head Node h = head; if (h == pred || h == s || h == null) return; // at head or list empty if (!h.isMatched()) break; Node hn = h.next; return; // now empty if (hn != h && casHead(h, hn)) h.forgetNext(); // advance head
if (item != e) { // matched s.forgetContents(); // avoid garbage return LinkedTransferQueue.<E>cast(item); s.casItem(e, s)) { // cancel unsplice(pred, s); return e;
if (casHead(null, s)) return s; // initialize } else if (p.cannotPrecede(haveData)) return null; // lost race vs opposite mode else if ((n = p.next) != null) // not last; keep traversing else if (!p.casNext(null, s))
if (casHead(null, s)) return s; // initialize } else if (p.cannotPrecede(haveData)) return null; // lost race vs opposite mode else if ((n = p.next) != null) // not last; keep traversing else if (!p.casNext(null, s))