code: private Object fulfill(Object e) {
      boolean isData = e != null;
      final PaddedAtomicReference<QNode> head = this.head;
      final PaddedAtomicReference<QNode> tail = this.tail;
  
      for (;;) {
        QNode t = tail.get();
        QNode h = head.get();
  
        if (t != null && (t == h || t.isData == isData)) {
          QNode last = t.next;
          if (t == tail.get()) {
            if (last != null) {
              tail.compareAndSet(t, last);
            } else {
              return null;
            }
          }
        } else if (h != null) {
          QNode first = h.next;
          if (t == tail.get() && first != null && advanceHead(h, first)) {
            Object x = first.get();
            if (x != first && first.compareAndSet(x, e)) {
              LockSupport.unpark(first.waiter);
              return isData ? e : x;
            }
          }
        }
      }
    }
docs: Version of xfer for poll() and tryTransfer, which simplifies control paths both here and in
  xfer