/** * uber_line_graph_add_line: * @graph: A #UberLineGraph. * @color: A #GdkColor for the line or %NULL. * * Adds a new line to the graph. If color is %NULL, the next value * in the default color list will be used. * * See uber_line_graph_remove_line(). * * Returns: The line identifier. * Side effects: None. */ gint uber_line_graph_add_line (UberLineGraph *graph, /* IN */ const GdkColor *color, /* IN */ UberLabel *label) /* IN */ { UberLineGraphPrivate *priv; LineInfo info = { 0 }; g_return_val_if_fail(UBER_IS_LINE_GRAPH(graph), 0); priv = graph->priv; info.alpha = 1.0; info.width = 1.0; /* * Retrieve the lines color. */ if (color) { info.color = *color; } else { gdk_color_parse("#729fcf", &info.color); } /* * Allocate buffers for data points. */ info.raw_data = g_ring_sized_new(sizeof(gdouble), priv->stride, NULL); uber_line_graph_init_ring(info.raw_data); /* * Store the newly crated line. */ g_array_append_val(priv->lines, info); /* * Mark the graph for full redraw. */ uber_graph_redraw(UBER_GRAPH(graph)); /* * Attach label. */ if (label) { uber_line_graph_bind_label(graph, priv->lines->len, label); uber_graph_add_label(UBER_GRAPH(graph), label); uber_label_set_color(label, &info.color); } /* * Line indexes start from 1. */ return priv->lines->len; }
/** * uber_label_set_property: * @object: (in): A #GObject. * @prop_id: (in): The property identifier. * @value: (in): The given property. * @pspec: (in): A #ParamSpec. * * Set a given #GObject property. */ static void uber_label_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { UberLabel *label = UBER_LABEL(object); switch (prop_id) { case PROP_COLOR: uber_label_set_color(label, g_value_get_boxed(value)); break; case PROP_TEXT: uber_label_set_text(label, g_value_get_string(value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); } }
gint main (gint argc, /* IN */ gchar *argv[]) /* IN */ { gdouble dashes[] = { 1.0, 4.0 }; UberRange cpu_range = { 0., 100., 100. }; UberRange net_range = { 0., 512., 512. }; UberRange ui_range = { 0., 10., 10. }; GtkWidget *window; GtkWidget *cpu; GtkWidget *net; GtkWidget *line; GtkWidget *map; GtkWidget *scatter; GtkWidget *label; GtkAccelGroup *ag; GdkColor color; gint lineno; gint nprocs; gint i; gint mod; g_thread_init(NULL); gtk_init(&argc, &argv); nprocs = get_nprocs(); /* * Check for blktrace hack. */ if (argc > 1 && (g_strcmp0(argv[1], "--i-can-haz-blktrace") == 0)) { want_blktrace = TRUE; } /* * Warm up differential samplers. */ smon_next_cpu_info(); smon_next_cpu_freq_info(); if (want_blktrace) { uber_blktrace_init(); } /* * Install event hook to track how many X events we are doing. */ gdk_event_handler_set(smon_gdk_event_hook, NULL, NULL); /* * Create window and graphs. */ window = uber_window_new(); cpu = uber_line_graph_new(); net = uber_line_graph_new(); line = uber_line_graph_new(); map = uber_heat_map_new(); scatter = uber_scatter_new(); /* * Configure CPU graph. */ uber_line_graph_set_autoscale(UBER_LINE_GRAPH(cpu), FALSE); uber_graph_set_format(UBER_GRAPH(cpu), UBER_GRAPH_FORMAT_PERCENT); uber_line_graph_set_range(UBER_LINE_GRAPH(cpu), &cpu_range); uber_line_graph_set_data_func(UBER_LINE_GRAPH(cpu), smon_get_cpu_info, NULL, NULL); for (i = 0; i < nprocs; i++) { mod = i % G_N_ELEMENTS(default_colors); gdk_color_parse(default_colors[mod], &color); label = uber_label_new(); uber_label_set_color(UBER_LABEL(label), &color); uber_line_graph_add_line(UBER_LINE_GRAPH(cpu), &color, UBER_LABEL(label)); cpu_info.labels[i] = label; /* * XXX: Add the line regardless. Just dont populate it if we don't * have data. */ lineno = uber_line_graph_add_line(UBER_LINE_GRAPH(cpu), &color, NULL); if (smon_cpu_has_freq_scaling(i)) { uber_line_graph_set_line_dash(UBER_LINE_GRAPH(cpu), lineno, dashes, G_N_ELEMENTS(dashes), 0); uber_line_graph_set_line_alpha(UBER_LINE_GRAPH(cpu), lineno, 1.); } } /* * Add lines for GDK/X events. */ uber_line_graph_set_range(UBER_LINE_GRAPH(line), &ui_range); label = uber_label_new(); uber_label_set_text(UBER_LABEL(label), "GDK Events"); gdk_color_parse("#729fcf", &color); uber_line_graph_add_line(UBER_LINE_GRAPH(line), &color, UBER_LABEL(label)); label = uber_label_new(); uber_label_set_text(UBER_LABEL(label), "X Events"); gdk_color_parse("#a40000", &color); uber_line_graph_add_line(UBER_LINE_GRAPH(line), &color, UBER_LABEL(label)); uber_line_graph_set_data_func(UBER_LINE_GRAPH(line), smon_get_xevent_info, NULL, NULL); /* * Add lines for bytes in/out. */ uber_line_graph_set_range(UBER_LINE_GRAPH(net), &net_range); uber_line_graph_set_data_func(UBER_LINE_GRAPH(net), smon_get_net_info, NULL, NULL); uber_graph_set_format(UBER_GRAPH(net), UBER_GRAPH_FORMAT_DIRECT1024); label = uber_label_new(); uber_label_set_text(UBER_LABEL(label), "Bytes In"); gdk_color_parse("#a40000", &color); uber_line_graph_add_line(UBER_LINE_GRAPH(net), &color, UBER_LABEL(label)); label = uber_label_new(); uber_label_set_text(UBER_LABEL(label), "Bytes Out"); gdk_color_parse("#4e9a06", &color); uber_line_graph_add_line(UBER_LINE_GRAPH(net), &color, UBER_LABEL(label)); /* * Configure heat map. */ uber_graph_set_show_ylines(UBER_GRAPH(map), FALSE); gdk_color_parse(default_colors[0], &color); uber_heat_map_set_fg_color(UBER_HEAT_MAP(map), &color); uber_heat_map_set_data_func(UBER_HEAT_MAP(map), (UberHeatMapFunc)dummy_scatter_func, NULL, NULL); uber_window_add_graph(UBER_WINDOW(window), UBER_GRAPH(map), "IO Latency"); uber_graph_set_show_xlabels(UBER_GRAPH(map), FALSE); gtk_widget_show(map); /* * Configure scatter. */ if (want_blktrace) { uber_graph_set_show_ylines(UBER_GRAPH(scatter), FALSE); gdk_color_parse(default_colors[3], &color); uber_scatter_set_fg_color(UBER_SCATTER(scatter), &color); uber_scatter_set_data_func(UBER_SCATTER(scatter), (UberScatterFunc)uber_blktrace_get, NULL, NULL); uber_window_add_graph(UBER_WINDOW(window), UBER_GRAPH(scatter), "IOPS By Size"); uber_graph_set_show_xlabels(UBER_GRAPH(scatter), TRUE); gtk_widget_show(scatter); } /* * Add graphs. */ uber_window_add_graph(UBER_WINDOW(window), UBER_GRAPH(cpu), "CPU"); uber_window_add_graph(UBER_WINDOW(window), UBER_GRAPH(net), "Network"); uber_window_add_graph(UBER_WINDOW(window), UBER_GRAPH(line), "UI Events"); /* * Disable X tick labels by default (except last). */ uber_graph_set_show_xlabels(UBER_GRAPH(cpu), FALSE); uber_graph_set_show_xlabels(UBER_GRAPH(net), FALSE); uber_graph_set_show_xlabels(UBER_GRAPH(line), FALSE); /* * Show widgets. */ gtk_widget_show(net); gtk_widget_show(line); gtk_widget_show(cpu); gtk_widget_show(window); /* * Show cpu labels by default. */ uber_window_show_labels(UBER_WINDOW(window), UBER_GRAPH(cpu)); /* * Setup accelerators. */ ag = gtk_accel_group_new(); gtk_accel_group_connect(ag, GDK_KEY_w, GDK_CONTROL_MASK, GTK_ACCEL_MASK, g_cclosure_new(gtk_main_quit, NULL, NULL)); gtk_window_add_accel_group(GTK_WINDOW(window), ag); /* * Attach signals. */ g_signal_connect(window, "delete-event", G_CALLBACK(gtk_main_quit), NULL); /* * Start sampling thread. */ g_thread_create((GThreadFunc)sample_thread, NULL, FALSE, NULL); gtk_main(); /* * Cleanup after blktrace. */ if (want_blktrace) { uber_blktrace_shutdown(); } return EXIT_SUCCESS; }