Example #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);
    }
  }
Example #2
0
 void won() {
   if (sa != null) {
     Object x = item;
     sa.setItem(x == CHANNEL_CLOSED ? null : x);
     sa.won();
   }
 }