aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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;