protected Object handleDownMessage(final Event evt, final Message msg, Address dest, int length) { if (dest != null) // 2nd line of defense, not really needed return down_prot.down(evt); long block_time = max_block_times != null ? getMaxBlockTime(length) : max_block_time; while (running) { boolean rc = credits.decrement(length, block_time); if (rc || max_block_times != null || !running) break; if (needToSendCreditRequest()) { List<Tuple<Address, Long>> targets = credits.getMembersWithCreditsLessThan(min_credits); for (Tuple<Address, Long> tuple : targets) sendCreditRequest(tuple.getVal1(), Math.min(max_credits, max_credits - tuple.getVal2())); } } // send message - either after regular processing, or after blocking (when enough credits are // available again) return down_prot.down(evt); }