aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile2
-rw-r--r--parse-events.c57
-rw-r--r--parse-events.h2
-rw-r--r--trace-util.c24
4 files changed, 60 insertions, 25 deletions
diff --git a/Makefile b/Makefile
index 7472c11..473682d 100644
--- a/Makefile
+++ b/Makefile
@@ -18,7 +18,7 @@ LIB_FILE = libparsevent.a
18trace-read.o:: parse-events.h 18trace-read.o:: parse-events.h
19trace-cmd.o:: parse-events.h $(LIB_FILE) 19trace-cmd.o:: parse-events.h $(LIB_FILE)
20 20
21trace-cmd:: trace-cmd.o trace-read.o 21trace-cmd:: trace-cmd.o trace-read.o trace-util.o
22 $(CC) $^ $(LIBS) -o $@ 22 $(CC) $^ $(LIBS) -o $@
23 23
24parse-events.o: parse-events.c parse-events.h 24parse-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
87void parse_cmdlines(char *file, int size __unused) 87static struct cmdline_list {
88 struct cmdline_list *next;
89 char *comm;
90 int pid;
91} *cmdlist = NULL;
92
93static 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
124static char *find_cmdline(int pid) 115static 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
136int 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
142static struct func_map { 151static 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
309int 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
10void 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}