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); } }
/** * Constructs a new node. Uses relaxed write because item can only be seen after publication via * casNext. */ Node(SelectActionImpl sa) { UNSAFE.putObject(this, itemOffset, sa.message()); // relaxed write UNSAFE.putObject(this, saOffset, sa); // relaxed write this.isData = sa.isData(); }