changeset 28:2175102c5611

MultiTokenBucket breaks on low throughput.
author shade
date Thu, 01 Dec 2016 11:12:55 +0100
parents b66d7f87cd46
children af1694c8b2a2
files src/main/java/org/openjdk/gcbench/util/ratelimit/MultiTokenBucket.java
diffstat 1 files changed, 3 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/main/java/org/openjdk/gcbench/util/ratelimit/MultiTokenBucket.java	Thu Dec 01 10:55:15 2016 +0100
+++ b/src/main/java/org/openjdk/gcbench/util/ratelimit/MultiTokenBucket.java	Thu Dec 01 11:12:55 2016 +0100
@@ -65,7 +65,7 @@
                 // try to optimistically poll my own ID
                 Counter my = states[id];
 
-                if (my.dec() >= 1) {
+                if (my.val() > 0 && my.dec() >= 1) {
                     return; // success!
                 }
 
@@ -157,9 +157,9 @@
         public int steal() {
             while (true) {
                 int val = CURRENT.get(this);
-                int steal = val / 2;
+                int steal = Math.max(1, val / 2); // try to steal at least one
                 int remain = val - steal;
-                if (remain <= 0)
+                if (remain < 0)
                     return 0;
                 if (CURRENT.compareAndSet(this, val, remain))
                     return steal;