diff options
-rw-r--r-- | trace-capture.c | 30 |
1 files changed, 29 insertions, 1 deletions
diff --git a/trace-capture.c b/trace-capture.c index 3066f1e..328d22d 100644 --- a/trace-capture.c +++ b/trace-capture.c | |||
@@ -52,6 +52,8 @@ | |||
52 | 52 | ||
53 | #define CAP_STOP "Stop" | 53 | #define CAP_STOP "Stop" |
54 | 54 | ||
55 | #define DEFAULT_MAX_BUF_SIZE 1000000 | ||
56 | |||
55 | struct trace_capture { | 57 | struct trace_capture { |
56 | struct pevent *pevent; | 58 | struct pevent *pevent; |
57 | struct shark_info *info; | 59 | struct shark_info *info; |
@@ -68,6 +70,7 @@ struct trace_capture { | |||
68 | gboolean kill_thread; | 70 | gboolean kill_thread; |
69 | gboolean capture_done; | 71 | gboolean capture_done; |
70 | gboolean load_file; | 72 | gboolean load_file; |
73 | gint max_buffer_size; | ||
71 | int command_input_fd; | 74 | int command_input_fd; |
72 | int command_output_fd; | 75 | int command_output_fd; |
73 | int command_pid; | 76 | int command_pid; |
@@ -623,14 +626,26 @@ static void execute_command(struct trace_capture *cap) | |||
623 | static void *monitor_pipes(void *data) | 626 | static void *monitor_pipes(void *data) |
624 | { | 627 | { |
625 | struct trace_capture *cap = data; | 628 | struct trace_capture *cap = data; |
629 | GtkTextIter start_iter; | ||
630 | GtkTextIter cut_iter; | ||
626 | GtkTextIter iter; | 631 | GtkTextIter iter; |
627 | gchar buf[BUFSIZ+1]; | 632 | gchar buf[BUFSIZ+1]; |
628 | struct timeval tv; | 633 | struct timeval tv; |
629 | fd_set fds; | 634 | fd_set fds; |
630 | gboolean eof; | 635 | gboolean eof; |
636 | int total; | ||
637 | int del; | ||
631 | int ret; | 638 | int ret; |
632 | int r; | 639 | int r; |
633 | 640 | ||
641 | /* Clear the buffer */ | ||
642 | gdk_threads_enter(); | ||
643 | gtk_text_buffer_get_start_iter(cap->output_buffer, &start_iter); | ||
644 | gtk_text_buffer_get_end_iter(cap->output_buffer, &cut_iter); | ||
645 | gtk_text_buffer_delete(cap->output_buffer, &start_iter, &cut_iter); | ||
646 | total = 0; | ||
647 | gdk_threads_leave(); | ||
648 | |||
634 | do { | 649 | do { |
635 | FD_ZERO(&fds); | 650 | FD_ZERO(&fds); |
636 | FD_SET(cap->command_input_fd, &fds); | 651 | FD_SET(cap->command_input_fd, &fds); |
@@ -644,7 +659,19 @@ static void *monitor_pipes(void *data) | |||
644 | while ((r = read(cap->command_input_fd, buf, BUFSIZ)) > 0) { | 659 | while ((r = read(cap->command_input_fd, buf, BUFSIZ)) > 0) { |
645 | eof = FALSE; | 660 | eof = FALSE; |
646 | buf[r] = 0; | 661 | buf[r] = 0; |
662 | total += r; | ||
663 | if (total > cap->max_buffer_size) | ||
664 | del = total - cap->max_buffer_size; | ||
665 | else | ||
666 | del = 0; | ||
647 | gdk_threads_enter(); | 667 | gdk_threads_enter(); |
668 | if (del) { | ||
669 | gtk_text_buffer_get_start_iter(cap->output_buffer, &start_iter); | ||
670 | gtk_text_buffer_get_start_iter(cap->output_buffer, &cut_iter); | ||
671 | gtk_text_iter_forward_chars(&cut_iter, del); | ||
672 | gtk_text_buffer_delete(cap->output_buffer, &start_iter, &cut_iter); | ||
673 | total -= del; | ||
674 | } | ||
648 | gtk_text_buffer_get_end_iter(cap->output_buffer, | 675 | gtk_text_buffer_get_end_iter(cap->output_buffer, |
649 | &iter); | 676 | &iter); |
650 | gtk_text_buffer_insert(cap->output_buffer, &iter, buf, -1); | 677 | gtk_text_buffer_insert(cap->output_buffer, &iter, buf, -1); |
@@ -1238,6 +1265,7 @@ static void tracing_dialog(struct shark_info *info, const char *tracing) | |||
1238 | trace_dialog_register_alt_warning(NULL); | 1265 | trace_dialog_register_alt_warning(NULL); |
1239 | 1266 | ||
1240 | cap.pevent = pevent; | 1267 | cap.pevent = pevent; |
1268 | cap.max_buffer_size = DEFAULT_MAX_BUF_SIZE; | ||
1241 | 1269 | ||
1242 | if (!pevent && !nr_plugins) { | 1270 | if (!pevent && !nr_plugins) { |
1243 | warning("No events or plugins found"); | 1271 | warning("No events or plugins found"); |
@@ -1424,7 +1452,7 @@ static void tracing_dialog(struct shark_info *info, const char *tracing) | |||
1424 | gtk_widget_set_size_request(GTK_WIDGET(vbox), 500, 0); | 1452 | gtk_widget_set_size_request(GTK_WIDGET(vbox), 500, 0); |
1425 | 1453 | ||
1426 | 1454 | ||
1427 | label = gtk_label_new("Command Output:"); | 1455 | label = gtk_label_new("Output Display:"); |
1428 | gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); | 1456 | gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); |
1429 | gtk_widget_show(label); | 1457 | gtk_widget_show(label); |
1430 | 1458 | ||