graph: drop more than 1 entry, if we are more than 1 above the limit
authorJens Axboe <axboe@kernel.dk>
Sun, 11 Mar 2012 20:35:47 +0000 (21:35 +0100)
committerJens Axboe <axboe@kernel.dk>
Sun, 11 Mar 2012 20:35:47 +0000 (21:35 +0100)
If we dynamically reduce the data entry limit, it's not enough to
drop one entry when we add one. In that case, drop two everytime
we add one. Then we'll eventually get smoothly down to the specified
limit.

Signed-off-by: Jens Axboe <axboe@kernel.dk>
graph.c

diff --git a/graph.c b/graph.c
index 111a7203b4a44ab5975cc43c730e8c808c13f429..9eae72722542cf7e4d477db49319562c281aa259 100644 (file)
--- a/graph.c
+++ b/graph.c
@@ -600,11 +600,24 @@ static void graph_label_add_value(struct graph_label *i, void *value)
 
        if (i->parent->per_label_limit != -1 &&
                i->value_count > i->parent->per_label_limit) {
 
        if (i->parent->per_label_limit != -1 &&
                i->value_count > i->parent->per_label_limit) {
-               x = i->values;
-               i->values = i->values->next;
-               free(x->value);
-               free(x);
-               i->value_count--;
+               int to_drop = 1;
+
+               /*
+                * If the limit was dynamically reduced, making us more
+                * than 1 entry ahead after adding this one, drop two
+                * entries. This will make us (eventually) reach the
+                * specified limit.
+                */
+               if (i->value_count - i->parent->per_label_limit >= 2)
+                       to_drop = 2;
+
+               while (to_drop--) {
+                       x = i->values;
+                       i->values = i->values->next;
+                       free(x->value);
+                       free(x);
+                       i->value_count--;
+               }
        }
 }
 
        }
 }