diff options
Diffstat (limited to 'trace-read.c')
-rw-r--r-- | trace-read.c | 69 |
1 files changed, 67 insertions, 2 deletions
diff --git a/trace-read.c b/trace-read.c index 8768f11..c05fc5d 100644 --- a/trace-read.c +++ b/trace-read.c | |||
@@ -38,6 +38,14 @@ | |||
38 | 38 | ||
39 | #include "trace-local.h" | 39 | #include "trace-local.h" |
40 | 40 | ||
41 | static struct filter { | ||
42 | struct filter *next; | ||
43 | const char *filter; | ||
44 | } *filter_strings; | ||
45 | static struct filter **filter_next = &filter_strings; | ||
46 | |||
47 | static struct event_filter *event_filters; | ||
48 | |||
41 | static unsigned int page_size; | 49 | static unsigned int page_size; |
42 | static int input_fd; | 50 | static int input_fd; |
43 | const char *input_file = "trace.dat"; | 51 | const char *input_file = "trace.dat"; |
@@ -189,12 +197,58 @@ static void test_save(struct record *record, int cpu) | |||
189 | } | 197 | } |
190 | #endif | 198 | #endif |
191 | 199 | ||
200 | static void add_filter(const char *filter) | ||
201 | { | ||
202 | struct filter *ftr; | ||
203 | |||
204 | ftr = malloc_or_die(sizeof(*ftr)); | ||
205 | ftr->filter = filter; | ||
206 | ftr->next = NULL; | ||
207 | |||
208 | /* must maintain order of command line */ | ||
209 | *filter_next = ftr; | ||
210 | filter_next = &ftr->next; | ||
211 | } | ||
212 | |||
213 | static void process_filters(struct tracecmd_input *handle) | ||
214 | { | ||
215 | struct pevent *pevent; | ||
216 | struct filter *filter; | ||
217 | char *errstr; | ||
218 | int ret; | ||
219 | |||
220 | pevent = tracecmd_get_pevent(handle); | ||
221 | event_filters = pevent_filter_alloc(pevent); | ||
222 | |||
223 | while (filter_strings) { | ||
224 | filter = filter_strings; | ||
225 | filter_strings = filter->next; | ||
226 | ret = pevent_filter_add_filter_str(event_filters, | ||
227 | filter->filter, | ||
228 | &errstr); | ||
229 | if (ret < 0) | ||
230 | die("Error filtering: %s\n %s", | ||
231 | filter->filter, errstr); | ||
232 | free(errstr); | ||
233 | free(filter); | ||
234 | } | ||
235 | } | ||
236 | |||
237 | static int filter_record(struct tracecmd_input *handle, | ||
238 | struct record *record) | ||
239 | { | ||
240 | return 0; | ||
241 | } | ||
242 | |||
192 | static void show_data(struct tracecmd_input *handle, | 243 | static void show_data(struct tracecmd_input *handle, |
193 | struct record *record, int cpu) | 244 | struct record *record, int cpu) |
194 | { | 245 | { |
195 | struct pevent *pevent; | 246 | struct pevent *pevent; |
196 | struct trace_seq s; | 247 | struct trace_seq s; |
197 | 248 | ||
249 | if (filter_record(handle, record)) | ||
250 | return; | ||
251 | |||
198 | pevent = tracecmd_get_pevent(handle); | 252 | pevent = tracecmd_get_pevent(handle); |
199 | 253 | ||
200 | test_save(record, cpu); | 254 | test_save(record, cpu); |
@@ -241,6 +295,8 @@ static void read_data_info(struct tracecmd_input *handle) | |||
241 | return; | 295 | return; |
242 | } | 296 | } |
243 | 297 | ||
298 | process_filters(handle); | ||
299 | |||
244 | do { | 300 | do { |
245 | next = -1; | 301 | next = -1; |
246 | ts = 0; | 302 | ts = 0; |
@@ -251,7 +307,13 @@ static void read_data_info(struct tracecmd_input *handle) | |||
251 | record = tracecmd_read_next_data(handle, &cpu); | 307 | record = tracecmd_read_next_data(handle, &cpu); |
252 | 308 | ||
253 | if (record) { | 309 | if (record) { |
254 | show_data(handle, record, next); | 310 | ret = pevent_filter_match(event_filters, record); |
311 | switch (ret) { | ||
312 | case FILTER_NONE: | ||
313 | case FILTER_MATCH: | ||
314 | show_data(handle, record, next); | ||
315 | break; | ||
316 | } | ||
255 | free_record(record); | 317 | free_record(record); |
256 | } | 318 | } |
257 | } while (record); | 319 | } while (record); |
@@ -296,7 +358,7 @@ void trace_report (int argc, char **argv) | |||
296 | {NULL, 0, NULL, 0} | 358 | {NULL, 0, NULL, 0} |
297 | }; | 359 | }; |
298 | 360 | ||
299 | c = getopt_long (argc-1, argv+1, "+hi:fepPlE", | 361 | c = getopt_long (argc-1, argv+1, "+hi:fepPlEF:", |
300 | long_options, &option_index); | 362 | long_options, &option_index); |
301 | if (c == -1) | 363 | if (c == -1) |
302 | break; | 364 | break; |
@@ -307,6 +369,9 @@ void trace_report (int argc, char **argv) | |||
307 | case 'i': | 369 | case 'i': |
308 | input_file = optarg; | 370 | input_file = optarg; |
309 | break; | 371 | break; |
372 | case 'F': | ||
373 | add_filter(optarg); | ||
374 | break; | ||
310 | case 'f': | 375 | case 'f': |
311 | show_funcs = 1; | 376 | show_funcs = 1; |
312 | break; | 377 | break; |