aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Rostedt <srostedt@redhat.com>2009-11-24 16:00:10 -0500
committerSteven Rostedt <rostedt@goodmis.org>2009-11-24 16:00:10 -0500
commitb1448ef5b7dfe05230123941f28f8bde7f9ea162 (patch)
treea0d5e7fa4ad02145ea16f473509e24b10bb9e294
parented16442fb72dadaac18c0d8ade509a9c8fc89746 (diff)
Separate out comm registry from app and library
The way the comm and pids are associated may be different with different apps. Let the app decide how it will register a mapping of comm and pid. Created trace-util.c file to hold the app side of comms. Create pevent_register_comm to implement the library register routine. Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
-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}