Lines Matching refs:dsos
15 void dsos__init(struct dsos *dsos) in dsos__init() argument
17 init_rwsem(&dsos->lock); in dsos__init()
19 dsos->cnt = 0; in dsos__init()
20 dsos->allocated = 0; in dsos__init()
21 dsos->dsos = NULL; in dsos__init()
22 dsos->sorted = true; in dsos__init()
25 static void dsos__purge(struct dsos *dsos) in dsos__purge() argument
27 down_write(&dsos->lock); in dsos__purge()
29 for (unsigned int i = 0; i < dsos->cnt; i++) { in dsos__purge()
30 struct dso *dso = dsos->dsos[i]; in dsos__purge()
36 zfree(&dsos->dsos); in dsos__purge()
37 dsos->cnt = 0; in dsos__purge()
38 dsos->allocated = 0; in dsos__purge()
39 dsos->sorted = true; in dsos__purge()
41 up_write(&dsos->lock); in dsos__purge()
44 void dsos__exit(struct dsos *dsos) in dsos__exit() argument
46 dsos__purge(dsos); in dsos__exit()
47 exit_rwsem(&dsos->lock); in dsos__exit()
51 static int __dsos__for_each_dso(struct dsos *dsos, in __dsos__for_each_dso() argument
55 for (unsigned int i = 0; i < dsos->cnt; i++) { in __dsos__for_each_dso()
56 struct dso *dso = dsos->dsos[i]; in __dsos__for_each_dso()
100 bool dsos__read_build_ids(struct dsos *dsos, bool with_hits) in dsos__read_build_ids() argument
107 dsos__for_each_dso(dsos, dsos__read_build_ids_cb, &args); in dsos__read_build_ids()
157 static struct dso *__dsos__find_by_longname_id(struct dsos *dsos, in __dsos__find_by_longname_id() argument
161 SHARED_LOCKS_REQUIRED(dsos->lock) in __dsos__find_by_longname_id()
169 if (dsos->dsos == NULL) in __dsos__find_by_longname_id()
172 if (!dsos->sorted) { in __dsos__find_by_longname_id()
176 up_read(&dsos->lock); in __dsos__find_by_longname_id()
177 down_write(&dsos->lock); in __dsos__find_by_longname_id()
178 dso = __dsos__find_by_longname_id(dsos, name, id, in __dsos__find_by_longname_id()
180 up_write(&dsos->lock); in __dsos__find_by_longname_id()
181 down_read(&dsos->lock); in __dsos__find_by_longname_id()
184 qsort(dsos->dsos, dsos->cnt, sizeof(struct dso *), in __dsos__find_by_longname_id()
186 dsos->sorted = true; in __dsos__find_by_longname_id()
189 res = bsearch(&key, dsos->dsos, dsos->cnt, sizeof(struct dso *), in __dsos__find_by_longname_id()
197 int __dsos__add(struct dsos *dsos, struct dso *dso) in __dsos__add() argument
199 if (dsos->cnt == dsos->allocated) { in __dsos__add()
203 if (dsos->allocated > 0) in __dsos__add()
204 to_allocate = dsos->allocated * 2; in __dsos__add()
205 temp = realloc(dsos->dsos, sizeof(struct dso *) * to_allocate); in __dsos__add()
208 dsos->dsos = temp; in __dsos__add()
209 dsos->allocated = to_allocate; in __dsos__add()
211 if (!dsos->sorted) { in __dsos__add()
212 dsos->dsos[dsos->cnt++] = dso__get(dso); in __dsos__add()
214 int low = 0, high = dsos->cnt - 1; in __dsos__add()
215 int insert = dsos->cnt; /* Default to inserting at the end. */ in __dsos__add()
219 int cmp = dsos__cmp_long_name_id_short_name(&dsos->dsos[mid], &dso); in __dsos__add()
228 memmove(&dsos->dsos[insert + 1], &dsos->dsos[insert], in __dsos__add()
229 (dsos->cnt - insert) * sizeof(struct dso *)); in __dsos__add()
230 dsos->cnt++; in __dsos__add()
231 dsos->dsos[insert] = dso__get(dso); in __dsos__add()
233 dso__set_dsos(dso, dsos); in __dsos__add()
237 int dsos__add(struct dsos *dsos, struct dso *dso) in dsos__add() argument
241 down_write(&dsos->lock); in dsos__add()
242 ret = __dsos__add(dsos, dso); in dsos__add()
243 up_write(&dsos->lock); in dsos__add()
265 static struct dso *__dsos__find_id(struct dsos *dsos, const char *name, const struct dso_id *id, in __dsos__find_id() argument
267 SHARED_LOCKS_REQUIRED(dsos->lock) in __dsos__find_id()
278 __dsos__for_each_dso(dsos, dsos__find_id_cb, &args); in __dsos__find_id()
281 res = __dsos__find_by_longname_id(dsos, name, id, write_locked); in __dsos__find_id()
285 struct dso *dsos__find(struct dsos *dsos, const char *name, bool cmp_short) in dsos__find() argument
289 down_read(&dsos->lock); in dsos__find()
290 res = __dsos__find_id(dsos, name, &dso_id_empty, cmp_short, /*write_locked=*/false); in dsos__find()
291 up_read(&dsos->lock); in dsos__find()
327 static struct dso *__dsos__addnew_id(struct dsos *dsos, const char *name, const struct dso_id *id) in __dsos__addnew_id() argument
338 __dsos__add(dsos, dso); in __dsos__addnew_id()
343 static struct dso *__dsos__findnew_id(struct dsos *dsos, const char *name, const struct dso_id *id) in __dsos__findnew_id() argument
344 SHARED_LOCKS_REQUIRED(dsos->lock) in __dsos__findnew_id()
346 struct dso *dso = __dsos__find_id(dsos, name, id, false, /*write_locked=*/true); in __dsos__findnew_id()
351 return dso ? dso : __dsos__addnew_id(dsos, name, id); in __dsos__findnew_id()
354 struct dso *dsos__findnew_id(struct dsos *dsos, const char *name, const struct dso_id *id) in dsos__findnew_id() argument
357 down_write(&dsos->lock); in dsos__findnew_id()
358 dso = __dsos__findnew_id(dsos, name, id); in dsos__findnew_id()
359 up_write(&dsos->lock); in dsos__findnew_id()
382 size_t dsos__fprintf_buildid(struct dsos *dsos, FILE *fp, in dsos__fprintf_buildid() argument
392 dsos__for_each_dso(dsos, dsos__fprintf_buildid_cb, &args); in dsos__fprintf_buildid()
409 size_t dsos__fprintf(struct dsos *dsos, FILE *fp) in dsos__fprintf() argument
416 dsos__for_each_dso(dsos, dsos__fprintf_cb, &args); in dsos__fprintf()
426 int dsos__hit_all(struct dsos *dsos) in dsos__hit_all() argument
428 return dsos__for_each_dso(dsos, dsos__hit_all_cb, NULL); in dsos__hit_all()
431 struct dso *dsos__findnew_module_dso(struct dsos *dsos, in dsos__findnew_module_dso() argument
438 down_write(&dsos->lock); in dsos__findnew_module_dso()
440 dso = __dsos__find_id(dsos, m->name, &dso_id_empty, /*cmp_short=*/true, in dsos__findnew_module_dso()
443 up_write(&dsos->lock); in dsos__findnew_module_dso()
453 up_write(&dsos->lock); in dsos__findnew_module_dso()
460 __dsos__add(dsos, dso); in dsos__findnew_module_dso()
462 up_write(&dsos->lock); in dsos__findnew_module_dso()
490 struct dso *dsos__find_kernel_dso(struct dsos *dsos) in dsos__find_kernel_dso() argument
494 dsos__for_each_dso(dsos, dsos__find_kernel_dso_cb, &res); in dsos__find_kernel_dso()
498 int dsos__for_each_dso(struct dsos *dsos, int (*cb)(struct dso *dso, void *data), void *data) in dsos__for_each_dso() argument
502 down_read(&dsos->lock); in dsos__for_each_dso()
503 err = __dsos__for_each_dso(dsos, cb, data); in dsos__for_each_dso()
504 up_read(&dsos->lock); in dsos__for_each_dso()