aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Rostedt <srostedt@redhat.com>2009-12-17 21:37:41 -0500
committerSteven Rostedt <rostedt@goodmis.org>2009-12-17 21:42:07 -0500
commitbed6e5c19bf745300dc045aa2242790cd6cc062b (patch)
treed9e9ff115ff81a0dc1de7f8c541958b4698f8ec5
parentc840022ef1b691dbb155ac3c0b0372348f71b49d (diff)
trace-cmd: Add ability to add new comms after first use
To speed up the reading of cmdlines to pid mappings, an unsorted list is used first to register comms (cmdlines). Once the list is used to seach, the list is converted to a sorted array to allow for fast binary searches. But once this was done, there was no way to add more cmdlines mappings. This now adds a slower version to add new cmdlines after the list has been made, but still makes it possible. Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
-rw-r--r--parse-events.c44
1 files changed, 43 insertions, 1 deletions
diff --git a/parse-events.c b/parse-events.c
index 424b367..818be40 100644
--- a/parse-events.c
+++ b/parse-events.c
@@ -135,7 +135,6 @@ int pevent_pid_is_registered(struct pevent *pevent, int pid)
135 if (!pid) 135 if (!pid)
136 return 1; 136 return 1;
137 137
138
139 if (!pevent->cmdlines) 138 if (!pevent->cmdlines)
140 cmdline_init(pevent); 139 cmdline_init(pevent);
141 140
@@ -149,6 +148,46 @@ int pevent_pid_is_registered(struct pevent *pevent, int pid)
149 return 0; 148 return 0;
150} 149}
151 150
151/*
152 * If the command lines have been converted to an array, then
153 * we must add this pid. This is much slower than when cmdlines
154 * are added before the array is initialized.
155 */
156static int add_new_comm(struct pevent *pevent, char *comm, int pid)
157{
158 struct cmdline *cmdlines = pevent->cmdlines;
159 const struct cmdline *cmdline;
160 struct cmdline key;
161
162 if (!pid)
163 return 0;
164
165 /* avoid duplicates */
166 key.pid = pid;
167
168 cmdline = bsearch(&key, pevent->cmdlines, pevent->cmdline_count,
169 sizeof(*pevent->cmdlines), cmdline_cmp);
170 if (cmdline) {
171 errno = EEXIST;
172 return -1;
173 }
174
175 cmdlines = realloc(cmdlines, sizeof(*cmdlines) * (pevent->cmdline_count + 1));
176 if (!cmdlines) {
177 errno = ENOMEM;
178 return -1;
179 }
180
181 cmdlines[pevent->cmdline_count].pid = pid;
182 cmdlines[pevent->cmdline_count].comm = comm;
183 pevent->cmdline_count++;
184
185 qsort(cmdlines, pevent->cmdline_count, sizeof(*cmdlines), cmdline_cmp);
186 pevent->cmdlines = cmdlines;
187
188 return 0;
189}
190
152/** 191/**
153 * pevent_register_comm - register a pid / comm mapping 192 * pevent_register_comm - register a pid / comm mapping
154 * @pevent: handle for the pevent 193 * @pevent: handle for the pevent
@@ -163,6 +202,9 @@ int pevent_register_comm(struct pevent *pevent, char *comm, int pid)
163{ 202{
164 struct cmdline_list *item; 203 struct cmdline_list *item;
165 204
205 if (pevent->cmdlines)
206 return add_new_comm(pevent, comm, pid);
207
166 item = malloc_or_die(sizeof(*item)); 208 item = malloc_or_die(sizeof(*item));
167 item->comm = comm; 209 item->comm = comm;
168 item->pid = pid; 210 item->pid = pid;