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); }
protected void handleCredit(Address sender, long increase) { Credit cred; if (sender == null || (cred = sent.get(sender)) == null || increase <= 0) return; long new_credit = Math.min(max_credits, cred.get() + increase); if (log.isTraceEnabled()) { StringBuilder sb = new StringBuilder(); sb.append("received " + increase + " credits from ") .append(sender) .append(", old credits: ") .append(cred) .append(", new credits: ") .append(new_credit); log.trace(sb); } cred.increment(increase); }