aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/util/trace-event-read.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/perf/util/trace-event-read.c')
-rw-r--r--tools/perf/util/trace-event-read.c116
1 files changed, 68 insertions, 48 deletions
diff --git a/tools/perf/util/trace-event-read.c b/tools/perf/util/trace-event-read.c
index 7cd1193918c7..cb54cd002f49 100644
--- a/tools/perf/util/trace-event-read.c
+++ b/tools/perf/util/trace-event-read.c
@@ -50,14 +50,51 @@ static int long_size;
50 50
51static unsigned long page_size; 51static unsigned long page_size;
52 52
53static ssize_t calc_data_size;
54static bool repipe;
55
56/* If it fails, the next read will report it */
57static void skip(int size)
58{
59 lseek(input_fd, size, SEEK_CUR);
60}
61
62static int do_read(int fd, void *buf, int size)
63{
64 int rsize = size;
65
66 while (size) {
67 int ret = read(fd, buf, size);
68
69 if (ret <= 0)
70 return -1;
71
72 if (repipe) {
73 int retw = write(STDOUT_FILENO, buf, ret);
74
75 if (retw <= 0 || retw != ret)
76 die("repiping input file");
77 }
78
79 size -= ret;
80 buf += ret;
81 }
82
83 return rsize;
84}
85
53static int read_or_die(void *data, int size) 86static int read_or_die(void *data, int size)
54{ 87{
55 int r; 88 int r;
56 89
57 r = read(input_fd, data, size); 90 r = do_read(input_fd, data, size);
58 if (r != size) 91 if (r <= 0)
59 die("reading input file (size expected=%d received=%d)", 92 die("reading input file (size expected=%d received=%d)",
60 size, r); 93 size, r);
94
95 if (calc_data_size)
96 calc_data_size += r;
97
61 return r; 98 return r;
62} 99}
63 100
@@ -82,57 +119,36 @@ static char *read_string(void)
82 char buf[BUFSIZ]; 119 char buf[BUFSIZ];
83 char *str = NULL; 120 char *str = NULL;
84 int size = 0; 121 int size = 0;
85 int i;
86 off_t r; 122 off_t r;
123 char c;
87 124
88 for (;;) { 125 for (;;) {
89 r = read(input_fd, buf, BUFSIZ); 126 r = read(input_fd, &c, 1);
90 if (r < 0) 127 if (r < 0)
91 die("reading input file"); 128 die("reading input file");
92 129
93 if (!r) 130 if (!r)
94 die("no data"); 131 die("no data");
95 132
96 for (i = 0; i < r; i++) { 133 if (repipe) {
97 if (!buf[i]) 134 int retw = write(STDOUT_FILENO, &c, 1);
98 break;
99 }
100 if (i < r)
101 break;
102 135
103 if (str) { 136 if (retw <= 0 || retw != r)
104 size += BUFSIZ; 137 die("repiping input file string");
105 str = realloc(str, size);
106 if (!str)
107 die("malloc of size %d", size);
108 memcpy(str + (size - BUFSIZ), buf, BUFSIZ);
109 } else {
110 size = BUFSIZ;
111 str = malloc_or_die(size);
112 memcpy(str, buf, size);
113 } 138 }
114 }
115 139
116 /* trailing \0: */ 140 buf[size++] = c;
117 i++; 141
118 142 if (!c)
119 /* move the file descriptor to the end of the string */ 143 break;
120 r = lseek(input_fd, -(r - i), SEEK_CUR);
121 if (r == (off_t)-1)
122 die("lseek");
123
124 if (str) {
125 size += i;
126 str = realloc(str, size);
127 if (!str)
128 die("malloc of size %d", size);
129 memcpy(str + (size - i), buf, i);
130 } else {
131 size = i;
132 str = malloc_or_die(i);
133 memcpy(str, buf, i);
134 } 144 }
135 145
146 if (calc_data_size)
147 calc_data_size += size;
148
149 str = malloc_or_die(size);
150 memcpy(str, buf, size);
151
136 return str; 152 return str;
137} 153}
138 154
@@ -174,7 +190,6 @@ static void read_ftrace_printk(void)
174static void read_header_files(void) 190static void read_header_files(void)
175{ 191{
176 unsigned long long size; 192 unsigned long long size;
177 char *header_page;
178 char *header_event; 193 char *header_event;
179 char buf[BUFSIZ]; 194 char buf[BUFSIZ];
180 195
@@ -184,10 +199,7 @@ static void read_header_files(void)
184 die("did not read header page"); 199 die("did not read header page");
185 200
186 size = read8(); 201 size = read8();
187 header_page = malloc_or_die(size); 202 skip(size);
188 read_or_die(header_page, size);
189 parse_header_page(header_page, size);
190 free(header_page);
191 203
192 /* 204 /*
193 * The size field in the page is of type long, 205 * The size field in the page is of type long,
@@ -459,7 +471,7 @@ struct record *trace_read_data(int cpu)
459 return data; 471 return data;
460} 472}
461 473
462void trace_report(int fd) 474ssize_t trace_report(int fd, bool __repipe)
463{ 475{
464 char buf[BUFSIZ]; 476 char buf[BUFSIZ];
465 char test[] = { 23, 8, 68 }; 477 char test[] = { 23, 8, 68 };
@@ -467,6 +479,10 @@ void trace_report(int fd)
467 int show_version = 0; 479 int show_version = 0;
468 int show_funcs = 0; 480 int show_funcs = 0;
469 int show_printk = 0; 481 int show_printk = 0;
482 ssize_t size;
483
484 calc_data_size = 1;
485 repipe = __repipe;
470 486
471 input_fd = fd; 487 input_fd = fd;
472 488
@@ -499,14 +515,18 @@ void trace_report(int fd)
499 read_proc_kallsyms(); 515 read_proc_kallsyms();
500 read_ftrace_printk(); 516 read_ftrace_printk();
501 517
518 size = calc_data_size - 1;
519 calc_data_size = 0;
520 repipe = false;
521
502 if (show_funcs) { 522 if (show_funcs) {
503 print_funcs(); 523 print_funcs();
504 return; 524 return size;
505 } 525 }
506 if (show_printk) { 526 if (show_printk) {
507 print_printk(); 527 print_printk();
508 return; 528 return size;
509 } 529 }
510 530
511 return; 531 return size;
512} 532}