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); }