예제 #1
1
파일: UFC.java 프로젝트: vblagoje/JGroups
  protected Object handleDownMessage(final Event evt, final Message msg, Address dest, int length) {
    if (dest == null) { // 2nd line of defense, not really needed
      log.error(
          getClass().getSimpleName() + " doesn't handle multicast messages; passing message down");
      return down_prot.down(evt);
    }

    Credit cred = sent.get(dest);
    if (cred == null) return down_prot.down(evt);

    long block_time = max_block_times != null ? getMaxBlockTime(length) : max_block_time;

    while (running && sent.containsKey(dest)) {
      boolean rc = cred.decrementIfEnoughCredits(length, block_time);
      if (rc || !running || max_block_times != null) break;

      if (cred.needToSendCreditRequest())
        sendCreditRequest(dest, Math.max(0, max_credits - cred.get()));
    }

    // send message - either after regular processing, or after blocking (when enough credits
    // available again)
    return down_prot.down(evt);
  }