| /* |
| * Copyright (C) 2012 Fusion-io |
| * |
| * This program is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU General Public |
| * License v2 as published by the Free Software Foundation. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| * |
| * You should have received a copy of the GNU General Public License |
| * along with this program; if not, write to the Free Software |
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
| * |
| */ |
| #ifndef __IOWATCH_PLOT__ |
| #define __IOWATCH_PLOT__ |
| #define MAX_TICKS 10 |
| |
| #include "list.h" |
| |
| typedef __u64 u64; |
| typedef __u32 u32; |
| typedef __u16 u16; |
| |
| |
| /* values for the plot direction field */ |
| #define PLOT_DOWN 0 |
| #define PLOT_ACROSS 1 |
| |
| struct plot { |
| int fd; |
| |
| /* svg style y = 0 is the top of the graph */ |
| int start_y_offset; |
| |
| /* abs coords of the start of X start of the plot */ |
| int start_x_offset; |
| |
| int add_xlabel; |
| int no_legend; |
| |
| /* |
| * these two are for anyone that wants |
| * to add a plot after this one, it tells |
| * them how much space we took up |
| */ |
| int total_height; |
| int total_width; |
| char **legend_lines; |
| int legend_index; |
| int num_legend_lines; |
| int direction; |
| |
| /* |
| * timeline is a vertical line through line graphs that |
| * is used by the movie mode to show where in the graph |
| * our current frame lives |
| */ |
| int timeline; |
| }; |
| |
| struct graph_line_pair { |
| u64 count; |
| u64 sum; |
| }; |
| |
| struct graph_line_data { |
| /* beginning of an interval displayed by this graph */ |
| int min_seconds; |
| |
| /* end of an interval displayed by this graph */ |
| int max_seconds; |
| |
| int stop_seconds; |
| |
| /* Y max */ |
| u64 max; |
| |
| /* label for this graph */ |
| char *label; |
| struct graph_line_pair data[]; |
| }; |
| |
| struct graph_dot_data { |
| u64 min_offset; |
| u64 max_offset; |
| u64 max_bank; |
| u64 max_bank_offset; |
| u64 total_ios; |
| u64 total_bank_ios; |
| |
| int add_bank_ios; |
| |
| /* in pixels, number of rows in our bitmap */ |
| int rows; |
| /* in pixels, number of cols in our bitmap */ |
| int cols; |
| |
| /* beginning of an interval displayed by this graph */ |
| int min_seconds; |
| |
| /* end of an interval displayed by this graph */ |
| int max_seconds; |
| int stop_seconds; |
| |
| /* label for the legend */ |
| char *label; |
| |
| /* color for plotting data */ |
| char *color; |
| |
| /* bitmap, one bit for each cell to light up */ |
| unsigned char data[]; |
| }; |
| |
| struct pid_plot_history { |
| double history_max; |
| int history_len; |
| int num_used; |
| char *color; |
| double *history; |
| }; |
| |
| struct plot_history { |
| struct list_head list; |
| int pid_history_count; |
| int col; |
| struct pid_plot_history **read_pid_history; |
| struct pid_plot_history **write_pid_history; |
| }; |
| |
| char *pick_color(void); |
| char *pick_fio_color(void); |
| char *pick_cpu_color(void); |
| void reset_cpu_color(void); |
| int svg_io_graph(struct plot *plot, struct graph_dot_data *gdd); |
| int svg_line_graph(struct plot *plot, struct graph_line_data *gld, char *color, int thresh1, int thresh2); |
| struct graph_line_data *alloc_line_data(int min_seconds, int max_seconds, int stop_seconds); |
| void free_line_data(struct graph_line_data *gld); |
| struct graph_dot_data *alloc_dot_data(int min_seconds, int max_seconds, u64 min_offset, u64 max_offset, int stop_seconds, char *color, char *label); |
| void free_dot_data(struct graph_dot_data *gdd); |
| void set_gdd_bit(struct graph_dot_data *gdd, u64 offset, double bytes, double time); |
| void print_gdd(struct graph_dot_data *gdd); |
| void write_svg_header(int fd); |
| struct plot *alloc_plot(void); |
| int close_plot(struct plot *plot); |
| int close_plot_no_height(struct plot *plot); |
| void setup_axis(struct plot *plot); |
| void set_xticks(struct plot *plot, int num_ticks, int first, int last); |
| void set_yticks(struct plot *plot, int num_ticks, int first, int last, char *units); |
| void set_plot_title(struct plot *plot, char *title); |
| void set_plot_label(struct plot *plot, char *label); |
| void set_xlabel(struct plot *plot, char *label); |
| void set_ylabel(struct plot *plot, char *label); |
| void scale_line_graph_bytes(u64 *max, char **units, u64 factor); |
| void scale_line_graph_time(u64 *max, char **units); |
| void write_drop_shadow(struct plot *plot); |
| void write_drop_shadow_line(struct plot *plot); |
| void svg_write_legend(struct plot *plot); |
| void svg_add_legend(struct plot *plot, char *text, char *extra, char *color); |
| void svg_alloc_legend(struct plot *plot, int num_lines); |
| void set_legend_width(int longest_str); |
| void set_rolling_avg(int rolling); |
| void svg_free_legend(struct plot *plot); |
| void set_io_graph_scale(int scale); |
| void set_plot_output(struct plot *plot, char *filename); |
| void set_graph_size(int width, int height); |
| void get_graph_size(int *width, int *height); |
| int svg_io_graph_movie(struct graph_dot_data *gdd, struct pid_plot_history *ph, int col); |
| int svg_io_graph_movie_array(struct plot *plot, struct pid_plot_history *ph); |
| void svg_write_time_line(struct plot *plot, int col); |
| void set_graph_height(int h); |
| void set_graph_width(int w); |
| int close_plot_file(struct plot *plot); |
| int svg_io_graph_movie_array_spindle(struct plot *plot, struct pid_plot_history *ph); |
| void rewind_spindle_steps(int num); |
| void setup_axis_spindle(struct plot *plot); |
| int close_plot_col(struct plot *plot); |
| |
| #endif |