aboutsummaryrefslogtreecommitdiffstats
path: root/trace-read.c
diff options
context:
space:
mode:
Diffstat (limited to 'trace-read.c')
-rw-r--r--trace-read.c69
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
41static struct filter {
42 struct filter *next;
43 const char *filter;
44} *filter_strings;
45static struct filter **filter_next = &filter_strings;
46
47static struct event_filter *event_filters;
48
41static unsigned int page_size; 49static unsigned int page_size;
42static int input_fd; 50static int input_fd;
43const char *input_file = "trace.dat"; 51const 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
200static 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
213static 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
237static int filter_record(struct tracecmd_input *handle,
238 struct record *record)
239{
240 return 0;
241}
242
192static void show_data(struct tracecmd_input *handle, 243static 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;