diff options
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | parse-events.c | 57 | ||||
-rw-r--r-- | parse-events.h | 2 | ||||
-rw-r--r-- | trace-util.c | 24 |
4 files changed, 60 insertions, 25 deletions
@@ -18,7 +18,7 @@ LIB_FILE = libparsevent.a | |||
18 | trace-read.o:: parse-events.h | 18 | trace-read.o:: parse-events.h |
19 | trace-cmd.o:: parse-events.h $(LIB_FILE) | 19 | trace-cmd.o:: parse-events.h $(LIB_FILE) |
20 | 20 | ||
21 | trace-cmd:: trace-cmd.o trace-read.o | 21 | trace-cmd:: trace-cmd.o trace-read.o trace-util.o |
22 | $(CC) $^ $(LIBS) -o $@ | 22 | $(CC) $^ $(LIBS) -o $@ |
23 | 23 | ||
24 | parse-events.o: parse-events.c parse-events.h | 24 | parse-events.o: parse-events.c parse-events.h |
diff --git a/parse-events.c b/parse-events.c index 46eaf08..c03dc08 100644 --- a/parse-events.c +++ b/parse-events.c | |||
@@ -84,41 +84,32 @@ static int cmdline_cmp(const void *a, const void *b) | |||
84 | return 0; | 84 | return 0; |
85 | } | 85 | } |
86 | 86 | ||
87 | void parse_cmdlines(char *file, int size __unused) | 87 | static struct cmdline_list { |
88 | struct cmdline_list *next; | ||
89 | char *comm; | ||
90 | int pid; | ||
91 | } *cmdlist = NULL; | ||
92 | |||
93 | static int cmdline_init(void) | ||
88 | { | 94 | { |
89 | struct cmdline_list { | 95 | struct cmdline_list *item; |
90 | struct cmdline_list *next; | ||
91 | char *comm; | ||
92 | int pid; | ||
93 | } *list = NULL, *item; | ||
94 | char *line; | ||
95 | char *next = NULL; | ||
96 | int i; | 96 | int i; |
97 | 97 | ||
98 | line = strtok_r(file, "\n", &next); | ||
99 | while (line) { | ||
100 | item = malloc_or_die(sizeof(*item)); | ||
101 | sscanf(line, "%d %as", &item->pid, | ||
102 | (float *)(void *)&item->comm); /* workaround gcc warning */ | ||
103 | item->next = list; | ||
104 | list = item; | ||
105 | line = strtok_r(NULL, "\n", &next); | ||
106 | cmdline_count++; | ||
107 | } | ||
108 | |||
109 | cmdlines = malloc_or_die(sizeof(*cmdlines) * cmdline_count); | 98 | cmdlines = malloc_or_die(sizeof(*cmdlines) * cmdline_count); |
110 | 99 | ||
111 | i = 0; | 100 | i = 0; |
112 | while (list) { | 101 | while (cmdlist) { |
113 | cmdlines[i].pid = list->pid; | 102 | cmdlines[i].pid = cmdlist->pid; |
114 | cmdlines[i].comm = list->comm; | 103 | cmdlines[i].comm = cmdlist->comm; |
115 | i++; | 104 | i++; |
116 | item = list; | 105 | item = cmdlist; |
117 | list = list->next; | 106 | cmdlist = cmdlist->next; |
118 | free(item); | 107 | free(item); |
119 | } | 108 | } |
120 | 109 | ||
121 | qsort(cmdlines, cmdline_count, sizeof(*cmdlines), cmdline_cmp); | 110 | qsort(cmdlines, cmdline_count, sizeof(*cmdlines), cmdline_cmp); |
111 | |||
112 | return 0; | ||
122 | } | 113 | } |
123 | 114 | ||
124 | static char *find_cmdline(int pid) | 115 | static char *find_cmdline(int pid) |
@@ -129,6 +120,9 @@ static char *find_cmdline(int pid) | |||
129 | if (!pid) | 120 | if (!pid) |
130 | return "<idle>"; | 121 | return "<idle>"; |
131 | 122 | ||
123 | if (!cmdlines) | ||
124 | cmdline_init(); | ||
125 | |||
132 | key.pid = pid; | 126 | key.pid = pid; |
133 | 127 | ||
134 | comm = bsearch(&key, cmdlines, cmdline_count, sizeof(*cmdlines), | 128 | comm = bsearch(&key, cmdlines, cmdline_count, sizeof(*cmdlines), |
@@ -139,6 +133,21 @@ static char *find_cmdline(int pid) | |||
139 | return "<...>"; | 133 | return "<...>"; |
140 | } | 134 | } |
141 | 135 | ||
136 | int pevent_register_comm(char *comm, int pid) | ||
137 | { | ||
138 | struct cmdline_list *item; | ||
139 | |||
140 | item = malloc_or_die(sizeof(*item)); | ||
141 | item->comm = comm; | ||
142 | item->pid = pid; | ||
143 | item->next = cmdlist; | ||
144 | |||
145 | cmdlist = item; | ||
146 | cmdline_count++; | ||
147 | |||
148 | return 0; | ||
149 | } | ||
150 | |||
142 | static struct func_map { | 151 | static struct func_map { |
143 | unsigned long long addr; | 152 | unsigned long long addr; |
144 | char *func; | 153 | char *func; |
diff --git a/parse-events.h b/parse-events.h index 8516672..41a57cc 100644 --- a/parse-events.h +++ b/parse-events.h | |||
@@ -306,4 +306,6 @@ enum trace_flag_type { | |||
306 | TRACE_FLAG_SOFTIRQ = 0x10, | 306 | TRACE_FLAG_SOFTIRQ = 0x10, |
307 | }; | 307 | }; |
308 | 308 | ||
309 | int pevent_register_comm(char *comm, int pid); | ||
310 | |||
309 | #endif /* _PARSE_EVENTS_H */ | 311 | #endif /* _PARSE_EVENTS_H */ |
diff --git a/trace-util.c b/trace-util.c new file mode 100644 index 0000000..563a75e --- /dev/null +++ b/trace-util.c | |||
@@ -0,0 +1,24 @@ | |||
1 | #define _GNU_SOURCE | ||
2 | #include <stdio.h> | ||
3 | #include <stdlib.h> | ||
4 | #include <string.h> | ||
5 | #include <ctype.h> | ||
6 | #include <errno.h> | ||
7 | |||
8 | #include "parse-events.h" | ||
9 | |||
10 | void parse_cmdlines(char *file, int size __unused) | ||
11 | { | ||
12 | char *comm; | ||
13 | char *line; | ||
14 | char *next = NULL; | ||
15 | int pid; | ||
16 | |||
17 | line = strtok_r(file, "\n", &next); | ||
18 | while (line) { | ||
19 | sscanf(line, "%d %as", &pid, | ||
20 | (float *)(void *)&comm); /* workaround gcc warning */ | ||
21 | pevent_register_comm(comm, pid); | ||
22 | line = strtok_r(NULL, "\n", &next); | ||
23 | } | ||
24 | } | ||