private Token xfer0(SelectActionImpl<Message> e) { final boolean haveData = e.isData(); Node s = null; // the node to append, if needed retry: for (; ; ) { // restart on append race if (!e.lease()) return null; if (isClosed() || (isSendClosed() && e.isData())) { e.setItem(null); e.won(); return null; } Object item = tryMatch(e, e.message(), haveData); if (item == LOST) return null; if (item != NO_MATCH) { e.setItem(item == CHANNEL_CLOSED ? null : (Message) item); e.won(); return null; } e.returnLease(); if (s == null) { s = new Node(e); requestUnpark(s, e.selector().getWaiter()); } Node pred = tryAppend(s, haveData); if (pred == null) continue retry; // lost race vs opposite mode return new Token(s, pred); } }
void won() { if (sa != null) { Object x = item; sa.setItem(x == CHANNEL_CLOSED ? null : x); sa.won(); } }