Пример #1
0
  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);
    }
  }
Пример #2
0
 /**
  * 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();
 }