private final void fill() {
    if (this.sinks.isEmpty()) {
      return;
    }

    this.buf.clear();
    this.inbound.get(this.buf);
    int off = 0;
    int end = this.buf.position();

    ByteSink currentSink = this.sinks.removeFirst();

    outer:
    while (off < end) {
      switch (currentSink.feed(this.buf.get(off))) {
        case ByteSink.FEED_ACCEPTED:
          off += 1;
          continue outer;

        case ByteSink.FEED_ACCEPTED_LAST:
          off += 1;
          break;

        case ByteSink.FEED_REJECTED:
          off += 0;
          break;
      }

      if (this.sinks.isEmpty()) {
        currentSink = null;
        break;
      }

      currentSink = this.sinks.removeFirst();
    }

    if (currentSink != null) {
      this.sinks.addFirst(currentSink);
    }

    this.inbound.discard(off);
  }