aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Rostedt <srostedt@redhat.com>2010-06-15 14:57:03 -0400
committerSteven Rostedt <rostedt@goodmis.org>2010-06-15 14:57:03 -0400
commit67aa1ab9dcbe4fabfc0c16f3ae8b8589bfbcab8a (patch)
treef34903f4ef3b44a0f58ac12346746730a281af06
parent2f27be407d208c77cf8a3611beffd6cd66931a39 (diff)
kernelshark: Add load and store of capture settings
Add the load and store buttons to the capture dialog that lets the user store and load at another time their capture settings. This lets them store events and plugins and retrieve it later. Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
-rw-r--r--trace-capture.c284
-rw-r--r--trace-cmd.h3
-rw-r--r--trace-util.c21
3 files changed, 283 insertions, 25 deletions
diff --git a/trace-capture.c b/trace-capture.c
index 7e5f7fc..b5e8852 100644
--- a/trace-capture.c
+++ b/trace-capture.c
@@ -40,6 +40,7 @@
40#include "trace-cmd.h" 40#include "trace-cmd.h"
41#include "trace-gui.h" 41#include "trace-gui.h"
42#include "kernel-shark.h" 42#include "kernel-shark.h"
43#include "version.h"
43 44
44#define default_output_file "trace.dat" 45#define default_output_file "trace.dat"
45 46
@@ -77,17 +78,10 @@ static int is_just_ws(const char *str)
77 78
78static void ks_clear_capture_events(struct shark_info *info) 79static void ks_clear_capture_events(struct shark_info *info)
79{ 80{
80 int i;
81
82 info->cap_all_events = FALSE; 81 info->cap_all_events = FALSE;
83 82
84 if (info->cap_systems) { 83 tracecmd_free_list(info->cap_systems);
85 for (i = 0; info->cap_systems[i]; i++) 84 info->cap_systems = NULL;
86 free(info->cap_systems[i]);
87
88 free(info->cap_systems);
89 info->cap_systems = NULL;
90 }
91 85
92 free(info->cap_events); 86 free(info->cap_events);
93 info->cap_events = NULL; 87 info->cap_events = NULL;
@@ -160,16 +154,6 @@ static char *get_tracing_dir(void)
160 return tracing_dir; 154 return tracing_dir;
161} 155}
162 156
163static void free_list(char **list)
164{
165 int i;
166
167 for (i = 0; list[i]; i++)
168 free(list[i]);
169
170 free(list);
171}
172
173static int is_latency(char *plugin) 157static int is_latency(char *plugin)
174{ 158{
175 return strcmp(plugin, "wakeup") == 0 || 159 return strcmp(plugin, "wakeup") == 0 ||
@@ -760,6 +744,246 @@ static void execute_button_clicked(GtkWidget *widget, gpointer data)
760 end_stop_dialog(cap); 744 end_stop_dialog(cap);
761} 745}
762 746
747static int load_events(struct trace_capture *cap,
748 struct tracecmd_xml_handle *handle,
749 struct tracecmd_xml_system_node *node)
750{
751 struct shark_info *info = cap->info;
752 struct tracecmd_xml_system_node *event_node;
753 struct event_format *event;
754 struct pevent *pevent = cap->pevent;
755 const char *name;
756 int *events = NULL;
757 int event_len = 0;
758 const char *system;
759 const char *event_name;
760
761 for (node = tracecmd_xml_node_child(node); node;
762 node = tracecmd_xml_node_next(node)) {
763 name = tracecmd_xml_node_type(node);
764
765 if (strcmp(name, "Event") != 0)
766 continue;
767
768 event_node = tracecmd_xml_node_child(node);
769 if (!event_node)
770 continue;
771
772 name = tracecmd_xml_node_type(event_node);
773 if (strcmp(name, "System") != 0)
774 continue;
775 system = tracecmd_xml_node_value(handle, event_node);
776
777 event_node = tracecmd_xml_node_next(event_node);
778 if (!event_node)
779 continue;
780
781 name = tracecmd_xml_node_type(event_node);
782 if (strcmp(name, "Name") != 0)
783 continue;
784 event_name = tracecmd_xml_node_value(handle, event_node);
785
786 event = pevent_find_event_by_name(pevent, system, event_name);
787
788 if (!event)
789 continue;
790
791 if (!events)
792 events = malloc_or_die(sizeof(*events) * 2);
793 else
794 events = realloc(events, sizeof(*events) * (event_len + 2));
795 events[event_len++] = event->id;
796 events[event_len] = -1;
797 }
798
799 info->cap_events = events;
800 return 0;
801}
802
803static int load_cap_events(struct trace_capture *cap,
804 struct tracecmd_xml_handle *handle,
805 struct tracecmd_xml_system_node *node)
806{
807 struct shark_info *info = cap->info;
808 const char *name;
809 char **systems = NULL;
810 int sys_len = 0;
811
812 ks_clear_capture_events(info);
813
814 for (node = tracecmd_xml_node_child(node); node;
815 node = tracecmd_xml_node_next(node)) {
816
817 name = tracecmd_xml_node_type(node);
818
819 if (strcmp(name, "CaptureType") == 0) {
820 name = tracecmd_xml_node_value(handle, node);
821 if (strcmp(name, "all events") == 0) {
822 info->cap_all_events = TRUE;
823 break;
824 }
825 continue;
826
827 } else if (strcmp(name, "System") == 0) {
828 name = tracecmd_xml_node_value(handle, node);
829 systems = tracecmd_add_list(systems, name, sys_len++);
830
831 } else if (strcmp(name, "Events") == 0)
832 load_events(cap, handle, node);
833 }
834
835 info->cap_systems = systems;
836
837 return 0;
838}
839
840static void load_settings_clicked(GtkWidget *widget, gpointer data)
841{
842 struct trace_capture *cap = data;
843 struct shark_info *info = cap->info;
844 struct tracecmd_xml_system_node *syschild;
845 struct tracecmd_xml_handle *handle;
846 struct tracecmd_xml_system *system;
847 const char *plugin;
848 const char *name;
849 gchar *filename;
850
851 filename = trace_get_file_dialog("Load Filters", NULL, FALSE);
852 if (!filename)
853 return;
854
855 handle = tracecmd_xml_open(filename);
856 if (!handle) {
857 warning("Could not open %s", filename);
858 g_free(filename);
859 }
860
861 g_free(filename);
862
863 system = tracecmd_xml_find_system(handle, "CaptureSettings");
864 if (!system)
865 goto out;
866
867 syschild = tracecmd_xml_system_node(system);
868 if (!syschild)
869 goto out_free_sys;
870
871 g_free(info->cap_plugin);
872 info->cap_plugin = NULL;
873
874 do {
875 name = tracecmd_xml_node_type(syschild);
876 if (strcmp(name, "Events") == 0)
877 load_cap_events(cap, handle, syschild);
878
879 else if (strcmp(name, "Plugin") == 0) {
880 plugin = tracecmd_xml_node_value(handle, syschild);
881 info->cap_plugin = g_strdup(plugin);
882
883 } else if (strcmp(name, "Command") == 0) {
884 name = tracecmd_xml_node_value(handle, syschild);
885 gtk_entry_set_text(GTK_ENTRY(cap->command_entry), name);
886
887 } else if (strcmp(name, "File") == 0) {
888 name = tracecmd_xml_node_value(handle, syschild);
889 gtk_entry_set_text(GTK_ENTRY(cap->file_entry), name);
890 }
891
892 syschild = tracecmd_xml_node_next(syschild);
893 } while (syschild);
894
895 set_plugin(cap);
896
897 out_free_sys:
898 tracecmd_xml_free_system(system);
899
900 out:
901 tracecmd_xml_close(handle);
902}
903
904static void save_events(struct trace_capture *cap,
905 struct tracecmd_xml_handle *handle)
906{
907 struct pevent *pevent = cap->pevent;
908 struct event_format *event;
909 char **systems = cap->info->cap_systems;
910 int *events = cap->info->cap_events;
911 int i;
912
913 tracecmd_xml_write_element(handle, "CaptureType", "Events");
914
915 for (i = 0; systems && systems[i]; i++)
916 tracecmd_xml_write_element(handle, "System", systems[i]);
917
918 if (!events || events[0] < 0)
919 return;
920
921 tracecmd_xml_start_sub_system(handle, "Events");
922 for (i = 0; events[i] > 0; i++) {
923 event = pevent_find_event(pevent, events[i]);
924 if (event) {
925 tracecmd_xml_start_sub_system(handle, "Event");
926 tracecmd_xml_write_element(handle, "System", event->system);
927 tracecmd_xml_write_element(handle, "Name", event->name);
928 tracecmd_xml_end_sub_system(handle);
929 }
930 }
931
932 tracecmd_xml_end_sub_system(handle);
933}
934
935static void save_settings_clicked(GtkWidget *widget, gpointer data)
936{
937 struct trace_capture *cap = data;
938 struct shark_info *info = cap->info;
939 struct tracecmd_xml_handle *handle;
940 gchar *filename;
941 const char *file;
942 const char *command;
943
944 filename = trace_get_file_dialog("Save Settings", "Save", TRUE);
945 if (!filename)
946 return;
947
948 handle = tracecmd_xml_create(filename, VERSION_STRING);
949 if (!handle) {
950 warning("Could not create %s", filename);
951 g_free(filename);
952 return;
953 }
954
955 g_free(filename);
956
957 tracecmd_xml_start_system(handle, "CaptureSettings");
958
959 tracecmd_xml_start_sub_system(handle, "Events");
960
961 if (info->cap_all_events)
962 tracecmd_xml_write_element(handle, "CaptureType", "all events");
963 else if ((info->cap_systems && info->cap_systems[0]) ||
964 (info->cap_events && info->cap_events[0] >= 0)) {
965 save_events(cap, handle);
966 }
967
968 tracecmd_xml_end_sub_system(handle);
969
970 update_plugin(cap);
971 if (info->cap_plugin)
972 tracecmd_xml_write_element(handle, "Plugin", info->cap_plugin);
973
974 command = gtk_entry_get_text(GTK_ENTRY(cap->command_entry));
975 if (command && strlen(command) && !is_just_ws(command))
976 tracecmd_xml_write_element(handle, "Command", command);
977
978 file = gtk_entry_get_text(GTK_ENTRY(cap->file_entry));
979 if (file && strlen(file) && !is_just_ws(file))
980 tracecmd_xml_write_element(handle, "File", file);
981
982 tracecmd_xml_end_system(handle);
983
984 tracecmd_xml_close(handle);
985}
986
763static GtkTreeModel *create_plugin_combo_model(gpointer data) 987static GtkTreeModel *create_plugin_combo_model(gpointer data)
764{ 988{
765 char **plugins = data; 989 char **plugins = data;
@@ -807,7 +1031,7 @@ static void tracing_dialog(struct shark_info *info, const char *tracing)
807 /* Skip latency plugins */ 1031 /* Skip latency plugins */
808 nr_plugins = trim_plugins(plugins); 1032 nr_plugins = trim_plugins(plugins);
809 if (!nr_plugins && plugins) { 1033 if (!nr_plugins && plugins) {
810 free_list(plugins); 1034 tracecmd_free_list(plugins);
811 plugins = NULL; 1035 plugins = NULL;
812 } 1036 }
813 1037
@@ -899,6 +1123,24 @@ static void tracing_dialog(struct shark_info *info, const char *tracing)
899 G_CALLBACK (execute_button_clicked), 1123 G_CALLBACK (execute_button_clicked),
900 (gpointer)&cap); 1124 (gpointer)&cap);
901 1125
1126
1127 button = gtk_button_new_with_label("Load Settings");
1128 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), button, TRUE, TRUE, 0);
1129 gtk_widget_show(button);
1130
1131 g_signal_connect (button, "clicked",
1132 G_CALLBACK (load_settings_clicked),
1133 (gpointer)&cap);
1134
1135
1136 button = gtk_button_new_with_label("Save Settings");
1137 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), button, TRUE, TRUE, 0);
1138 gtk_widget_show(button);
1139
1140 g_signal_connect (button, "clicked",
1141 G_CALLBACK (save_settings_clicked),
1142 (gpointer)&cap);
1143
902 gtk_widget_show(dialog); 1144 gtk_widget_show(dialog);
903 gtk_dialog_run(GTK_DIALOG(dialog)); 1145 gtk_dialog_run(GTK_DIALOG(dialog));
904 1146
@@ -926,7 +1168,7 @@ static void tracing_dialog(struct shark_info *info, const char *tracing)
926 pevent_free(pevent); 1168 pevent_free(pevent);
927 1169
928 if (plugins) 1170 if (plugins)
929 free_list(plugins); 1171 tracecmd_free_list(plugins);
930} 1172}
931 1173
932void tracecmd_capture_clicked(gpointer data) 1174void tracecmd_capture_clicked(gpointer data)
diff --git a/trace-cmd.h b/trace-cmd.h
index c85bb9b..cbd563e 100644
--- a/trace-cmd.h
+++ b/trace-cmd.h
@@ -40,6 +40,9 @@ char **tracecmd_system_events(const char *tracing_dir, const char *system);
40struct pevent *tracecmd_local_events(const char *tracing_dir); 40struct pevent *tracecmd_local_events(const char *tracing_dir);
41char **tracecmd_local_plugins(const char *tracing_dir); 41char **tracecmd_local_plugins(const char *tracing_dir);
42 42
43char **tracecmd_add_list(char **list, const char *name, int len);
44void tracecmd_free_list(char **list);
45
43enum { 46enum {
44 RINGBUF_TYPE_PADDING = 29, 47 RINGBUF_TYPE_PADDING = 29,
45 RINGBUF_TYPE_TIME_EXTEND = 30, 48 RINGBUF_TYPE_TIME_EXTEND = 30,
diff --git a/trace-util.c b/trace-util.c
index 82c3d1e..058c9d2 100644
--- a/trace-util.c
+++ b/trace-util.c
@@ -241,7 +241,7 @@ static char *append_file(const char *dir, const char *name)
241 return file; 241 return file;
242} 242}
243 243
244static char **add_list(char **list, const char *name, int len) 244char **tracecmd_add_list(char **list, const char *name, int len)
245{ 245{
246 if (!list) 246 if (!list)
247 list = malloc_or_die(sizeof(*list) * 2); 247 list = malloc_or_die(sizeof(*list) * 2);
@@ -260,6 +260,19 @@ static char **add_list(char **list, const char *name, int len)
260 return list; 260 return list;
261} 261}
262 262
263void tracecmd_free_list(char **list)
264{
265 int i;
266
267 if (!list)
268 return;
269
270 for (i = 0; list[i]; i++)
271 free(list[i]);
272
273 free(list);
274}
275
263/** 276/**
264 * tracecmd_event_systems - return list of systems for tracing 277 * tracecmd_event_systems - return list of systems for tracing
265 * @tracing_dir: directory holding the "events" directory 278 * @tracing_dir: directory holding the "events" directory
@@ -317,7 +330,7 @@ char **tracecmd_event_systems(const char *tracing_dir)
317 330
318 ret = stat(enable, &st); 331 ret = stat(enable, &st);
319 if (ret >= 0) 332 if (ret >= 0)
320 systems = add_list(systems, name, len++); 333 systems = tracecmd_add_list(systems, name, len++);
321 334
322 free(enable); 335 free(enable);
323 free(sys); 336 free(sys);
@@ -397,7 +410,7 @@ char **tracecmd_system_events(const char *tracing_dir, const char *system)
397 410
398 ret = stat(enable, &st); 411 ret = stat(enable, &st);
399 if (ret >= 0) 412 if (ret >= 0)
400 events = add_list(events, name, len++); 413 events = tracecmd_add_list(events, name, len++);
401 414
402 free(enable); 415 free(enable);
403 free(event); 416 free(event);
@@ -645,7 +658,7 @@ char **tracecmd_local_plugins(const char *tracing_dir)
645 strcmp(plugin, "none") == 0) 658 strcmp(plugin, "none") == 0)
646 continue; 659 continue;
647 660
648 plugins = add_list(plugins, plugin, len++); 661 plugins = tracecmd_add_list(plugins, plugin, len++);
649 } 662 }
650 free(buf); 663 free(buf);
651 664