aboutsummaryrefslogtreecommitdiffstats
path: root/trace-capture.c
diff options
context:
space:
mode:
Diffstat (limited to 'trace-capture.c')
-rw-r--r--trace-capture.c81
1 files changed, 23 insertions, 58 deletions
diff --git a/trace-capture.c b/trace-capture.c
index 0c0a52e..09af35b 100644
--- a/trace-capture.c
+++ b/trace-capture.c
@@ -50,6 +50,8 @@
50#define DIALOG_WIDTH 820 50#define DIALOG_WIDTH 820
51#define DIALOG_HEIGHT 600 51#define DIALOG_HEIGHT 600
52 52
53#define CAP_STOP "Stop"
54
53struct trace_capture { 55struct trace_capture {
54 struct pevent *pevent; 56 struct pevent *pevent;
55 struct shark_info *info; 57 struct shark_info *info;
@@ -61,7 +63,7 @@ struct trace_capture {
61 GtkWidget *event_view; 63 GtkWidget *event_view;
62 GtkWidget *plugin_combo; 64 GtkWidget *plugin_combo;
63 GtkWidget *settings_combo; 65 GtkWidget *settings_combo;
64 GtkWidget *stop_dialog; 66 GtkWidget *run_button;
65 pthread_t thread; 67 pthread_t thread;
66 gboolean kill_thread; 68 gboolean kill_thread;
67 gboolean capture_done; 69 gboolean capture_done;
@@ -229,11 +231,18 @@ void kernel_shark_clear_capture(struct shark_info *info)
229 info->cap_file = NULL; 231 info->cap_file = NULL;
230} 232}
231 233
232static void end_capture(struct trace_capture *cap) 234static gboolean end_capture(struct trace_capture *cap)
233{ 235{
234 const char *filename; 236 const char *filename;
237 const char *val;
235 int pid; 238 int pid;
236 239
240 val = gtk_button_get_label(GTK_BUTTON(cap->run_button));
241 if (strcmp(val, CAP_STOP) != 0)
242 return FALSE;
243
244 gtk_button_set_label(GTK_BUTTON(cap->run_button), "Run");
245
237 cap->capture_done = TRUE; 246 cap->capture_done = TRUE;
238 247
239 pid = cap->command_pid; 248 pid = cap->command_pid;
@@ -267,6 +276,8 @@ static void end_capture(struct trace_capture *cap)
267 kernelshark_load_file(cap->info, filename); 276 kernelshark_load_file(cap->info, filename);
268 cap->load_file = FALSE; 277 cap->load_file = FALSE;
269 } 278 }
279
280 return TRUE;
270} 281}
271 282
272static char *get_tracing_dir(void) 283static char *get_tracing_dir(void)
@@ -609,36 +620,6 @@ static void execute_command(struct trace_capture *cap)
609 g_free(cap->info->cap_plugin); 620 g_free(cap->info->cap_plugin);
610} 621}
611 622
612static gint
613delete_stop_dialog(GtkWidget *widget, GdkEvent *event, gpointer data)
614{
615 struct trace_capture *cap = data;
616 GtkWidget *dialog = cap->stop_dialog;
617
618 cap->stop_dialog = NULL;
619 if (!dialog)
620 return TRUE;
621
622 end_capture(cap);
623 gtk_widget_destroy(dialog);
624
625 return TRUE;
626}
627
628void end_stop_dialog(struct trace_capture *cap)
629{
630 GdkEvent dummy_event;
631 gboolean dummy_retval;
632 guint sigid;
633
634 if (!cap->stop_dialog)
635 return;
636
637 sigid = g_signal_lookup("delete-event", G_OBJECT_TYPE(cap->stop_dialog));
638 g_signal_emit(cap->stop_dialog, sigid, 0,
639 cap->stop_dialog, &dummy_event , cap, &dummy_retval);
640}
641
642static void *monitor_pipes(void *data) 623static void *monitor_pipes(void *data)
643{ 624{
644 struct trace_capture *cap = data; 625 struct trace_capture *cap = data;
@@ -673,7 +654,7 @@ static void *monitor_pipes(void *data)
673 654
674 if (eof) { 655 if (eof) {
675 gdk_threads_enter(); 656 gdk_threads_enter();
676 end_stop_dialog(cap); 657 end_capture(cap);
677 gdk_threads_leave(); 658 gdk_threads_leave();
678 } 659 }
679 660
@@ -785,11 +766,12 @@ static void execute_button_clicked(struct trace_capture *cap)
785{ 766{
786 struct stat st; 767 struct stat st;
787 GtkResponseType ret; 768 GtkResponseType ret;
788 GtkWidget *dialog;
789 GtkWidget *label;
790 const char *filename; 769 const char *filename;
791 char *tracecmd; 770 char *tracecmd;
792 771
772 if (end_capture(cap))
773 return;
774
793 tracecmd = find_tracecmd(); 775 tracecmd = find_tracecmd();
794 if (!tracecmd) { 776 if (!tracecmd) {
795 warning("trace-cmd not found in path"); 777 warning("trace-cmd not found in path");
@@ -808,28 +790,8 @@ static void execute_button_clicked(struct trace_capture *cap)
808 return; 790 return;
809 } 791 }
810 792
793 gtk_button_set_label(GTK_BUTTON(cap->run_button), CAP_STOP);
811 run_command(cap); 794 run_command(cap);
812
813 dialog = gtk_dialog_new_with_buttons("Stop Execution",
814 NULL,
815 GTK_DIALOG_MODAL,
816 "Stop",
817 GTK_RESPONSE_ACCEPT,
818 NULL);
819
820 cap->stop_dialog = dialog;
821
822 label = gtk_label_new("Hit Stop to end execution");
823 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), label, TRUE, FALSE, 0);
824 gtk_widget_show(label);
825
826 gtk_signal_connect(GTK_OBJECT (dialog), "delete_event",
827 (GtkSignalFunc)delete_stop_dialog,
828 (gpointer)cap);
829
830 gtk_dialog_run(GTK_DIALOG(dialog));
831
832 end_stop_dialog(cap);
833} 795}
834 796
835static int load_events(struct trace_capture *cap, 797static int load_events(struct trace_capture *cap,
@@ -1290,6 +1252,8 @@ static void tracing_dialog(struct shark_info *info, const char *tracing)
1290 GTK_RESPONSE_ACCEPT); 1252 GTK_RESPONSE_ACCEPT);
1291 gtk_widget_show(button); 1253 gtk_widget_show(button);
1292 1254
1255 cap.run_button = button;
1256
1293 gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_CANCEL, 1257 gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_CANCEL,
1294 GTK_RESPONSE_REJECT); 1258 GTK_RESPONSE_REJECT);
1295 1259
@@ -1500,6 +1464,9 @@ static void tracing_dialog(struct shark_info *info, const char *tracing)
1500 goto cont; 1464 goto cont;
1501 } 1465 }
1502 1466
1467 /* Make sure no capture is running */
1468 end_capture(&cap);
1469
1503 /* save the plugin and file to reuse if we come back */ 1470 /* save the plugin and file to reuse if we come back */
1504 update_plugin(&cap); 1471 update_plugin(&cap);
1505 1472
@@ -1517,8 +1484,6 @@ static void tracing_dialog(struct shark_info *info, const char *tracing)
1517 1484
1518 gtk_widget_destroy(dialog); 1485 gtk_widget_destroy(dialog);
1519 1486
1520 end_capture(&cap);
1521
1522 if (pevent) 1487 if (pevent)
1523 pevent_free(pevent); 1488 pevent_free(pevent);
1524 1489