/** reserve without wait, fail with NotEnoughBudgetException immediately if no mem */ public void reserve(MemoryConsumer consumer, int requestMB) { if (totalBudgetMB == 0 && requestMB > 0) throw new NotEnoughBudgetException(); boolean ok = false; while (!ok) { int gap = calculateGap(consumer, requestMB); if (gap > 0) { // to void deadlock, don't hold lock when invoking consumer.freeUp() tryFreeUp(gap); } ok = updateBooking(consumer, requestMB); } }
/** reserve without wait, fail with NotEnoughBudgetException immediately if no mem */ public void reserve(MemoryConsumer consumer, int requestMB) { if (totalBudgetMB == 0 && requestMB > 0) throw new NotEnoughBudgetException(); boolean ok = false; while (!ok) { int gap = calculateGap(consumer, requestMB); if (gap > 0) { // to void deadlock, don't hold lock when invoking consumer.freeUp() tryFreeUp(gap); } ok = updateBooking(consumer, requestMB); } }