gfio: leave notebook entry as the file name
[fio.git] / graph.c
diff --git a/graph.c b/graph.c
index 146ed7b148d9c7594c0002be5cfff0884896c888..c5431715c79dbe7bb8a0252c8b69b5137b94b06b 100644 (file)
--- a/graph.c
+++ b/graph.c
@@ -62,6 +62,7 @@ struct graph_label {
        struct flist_head value_list;
        struct prio_tree_root prio_tree;
        double r, g, b;
+       int hide;
        int value_count;
        struct graph *parent;
 };
@@ -83,6 +84,7 @@ struct graph {
        graph_axis_unit_change_callback x_axis_unit_change_callback;
        graph_axis_unit_change_callback y_axis_unit_change_callback;
        unsigned int base_offset;
+       unsigned int dont_graph_all_zeroes;
        double left_extra;      
        double right_extra;     
        double top_extra;       
@@ -174,8 +176,9 @@ static double find_double_values(struct graph_label *l, double_comparator cmp)
        double answer, tmp;
        int first = 1;
 
-       assert(!flist_empty(&l->value_list));
-       answer = 0.0; /* shut the compiler up, might need to think harder though. */
+       if (flist_empty(&l->value_list))
+               return 0.0;
+
        flist_for_each(entry, &l->value_list) {
                struct graph_value *i;
 
@@ -198,8 +201,9 @@ static double find_double_data(struct graph *g, double_comparator cmp)
        int first = 1;
        double answer, tmp;
 
-       assert(!flist_empty(&g->label_list));
-       answer = 0.0; /* shut the compiler up, might need to think harder though. */
+       if (flist_empty(&g->label_list))
+               return 0.0;
+
        flist_for_each(entry, &g->label_list) {
                i = flist_entry(entry, struct graph_label, list);
                tmp = find_double_values(i, cmp);
@@ -573,7 +577,7 @@ static double find_xy_value(struct graph *g, xy_value_extractor getvalue, double
        }
 
        return answer;
-} 
+}
 
 void line_graph_draw(struct graph *g, cairo_t *cr)
 {
@@ -640,7 +644,7 @@ void line_graph_draw(struct graph *g, cairo_t *cr)
        flist_for_each(lentry, &g->label_list) {
                i = flist_entry(lentry, struct graph_label, list);
                first = 1;
-               if (i->r < 0) /* invisible data */
+               if (i->hide || i->r < 0) /* invisible data */
                        continue;
 
                cairo_set_source_rgb(cr, i->r, i->g, i->b);
@@ -716,7 +720,7 @@ void graph_add_label(struct graph *bg, const char *label)
 
 static void __graph_value_drop(struct graph_label *l, struct graph_value *v)
 {
-       flist_del(&v->list);
+       flist_del_init(&v->list);
        if (v->tooltip)
                free(v->tooltip);
        free(v->value);
@@ -726,8 +730,6 @@ static void __graph_value_drop(struct graph_label *l, struct graph_value *v)
 
 static void graph_value_drop(struct graph_label *l, struct graph_value *v)
 {
-       struct flist_head *entry, *tmp;
-
        /*
         * Find head, the guy that's on the prio tree
         */
@@ -741,11 +743,11 @@ static void graph_value_drop(struct graph_label *l, struct graph_value *v)
        /*
         * Free aliases
         */
-       flist_for_each_safe(entry, tmp, &v->alias) {
+       while (!flist_empty(&v->alias)) {
                struct graph_value *a;
 
-               a = flist_entry(entry, struct graph_value, alias);
-               flist_del(&a->alias);
+               a = flist_entry(v->alias.next, struct graph_value, alias);
+               flist_del_init(&a->alias);
 
                __graph_value_drop(l, a);
        }
@@ -845,20 +847,40 @@ int graph_add_data(struct graph *bg, const char *label, const double value)
        return 0;
 }
 
+static int graph_nonzero_y(struct graph_label *l)
+{
+       struct flist_head *entry;
+
+       flist_for_each(entry, &l->value_list) {
+               struct graph_value *v;
+
+               v = flist_entry(entry, struct graph_value, list);
+               if (gety(v) != 0.0)
+                       return 1;
+       }
+
+       return 0;
+}
+
 int graph_add_xy_data(struct graph *bg, const char *label,
                      const double x, const double y, const char *tooltip)
 {
        struct graph_label *i;
        struct xyvalue *xy;
 
-       xy = malloc(sizeof(*xy));
-       xy->x = x;
-       xy->y = y;
-
        i = graph_find_label(bg, label);
        if (!i)
                return -1;
 
+       if (bg->dont_graph_all_zeroes && y == 0.0 && !graph_nonzero_y(i))
+               i->hide = 1;
+       else
+               i->hide = 0;
+
+       xy = malloc(sizeof(*xy));
+       xy->x = x;
+       xy->y = y;
+
        graph_label_add_value(i, xy, tooltip);
        return 0;
 }
@@ -1006,6 +1028,8 @@ const char *graph_find_tooltip(struct graph *g, int ix, int iy)
                struct graph_label *i;
 
                i = flist_entry(entry, struct graph_label, list);
+               if (i->hide)
+                       continue;
 
                INIT_PRIO_TREE_ITER(&iter);
                prio_tree_iter_init(&iter, &i->prio_tree, x, x);
@@ -1043,7 +1067,8 @@ const char *graph_find_tooltip(struct graph *g, int ix, int iy)
                /*
                 * If we got matches in one label, don't check others.
                 */
-               break;
+               if (best)
+                       break;
        }
 
        if (best)
@@ -1051,3 +1076,8 @@ const char *graph_find_tooltip(struct graph *g, int ix, int iy)
 
        return NULL;
 }
+
+void graph_set_graph_all_zeroes(struct graph *g, unsigned int set)
+{
+       g->dont_graph_all_zeroes = !set;
+}