aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--trace-capture.c30
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
55struct trace_capture { 57struct 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)
623static void *monitor_pipes(void *data) 626static 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