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