}
}
-static bool write_buildid_table(int fd)
+static void write_buildid_table(int fd, struct list_head *id_head)
{
- struct dso *pos;
- bool have_buildid = false;
-
- list_for_each_entry(pos, &dsos, node) {
- struct build_id_event b;
- size_t len;
-
- if (filename__read_build_id(pos->long_name,
- &b.build_id,
- sizeof(b.build_id)) < 0)
- continue;
- have_buildid = true;
- memset(&b.header, 0, sizeof(b.header));
- len = strlen(pos->long_name) + 1;
- len = ALIGN(len, 64);
- b.header.size = sizeof(b) + len;
- do_write(fd, &b, sizeof(b));
- do_write(fd, pos->long_name, len);
- }
+ struct build_id_list *iter, *next;
+
+ list_for_each_entry_safe(iter, next, id_head, list) {
+ struct build_id_event *b = &iter->event;
- return have_buildid;
+ do_write(fd, b, sizeof(*b));
+ do_write(fd, (void *)iter->dso_name, iter->len);
+ list_del(&iter->list);
+ free(iter);
+ }
}
static void
}
if (at_exit) {
- lseek(fd, self->data_offset + self->data_size, SEEK_SET);
- if (write_buildid_table(fd))
+ LIST_HEAD(id_list);
+
+ if (fetch_build_id_table(&id_list)) {
+ lseek(fd, self->data_offset + self->data_size, SEEK_SET);
perf_header__set_feat(self, HEADER_BUILD_ID);
- lseek(fd, cur_offset, SEEK_SET);
+ write_buildid_table(fd, &id_list);
+ lseek(fd, cur_offset, SEEK_SET);
+ }
}
};
return err;
}
+bool fetch_build_id_table(struct list_head *head)
+{
+ bool have_buildid = false;
+ struct dso *pos;
+
+ list_for_each_entry(pos, &dsos, node) {
+ struct build_id_list *new;
+ struct build_id_event b;
+ size_t len;
+
+ if (filename__read_build_id(pos->long_name,
+ &b.build_id,
+ sizeof(b.build_id)) < 0)
+ continue;
+ have_buildid = true;
+ memset(&b.header, 0, sizeof(b.header));
+ len = strlen(pos->long_name) + 1;
+ len = ALIGN(len, 64);
+ b.header.size = sizeof(b) + len;
+
+ new = malloc(sizeof(*new));
+ if (!new)
+ die("No memory\n");
+
+ memcpy(&new->event, &b, sizeof(b));
+ new->dso_name = pos->long_name;
+ new->len = len;
+
+ list_add_tail(&new->list, head);
+ }
+
+ return have_buildid;
+}
+
int filename__read_build_id(const char *filename, void *bf, size_t size)
{
int fd, err = -1;
void dso__set_build_id(struct dso *self, void *build_id);
int filename__read_build_id(const char *filename, void *bf, size_t size);
+bool fetch_build_id_table(struct list_head *head);
int build_id__sprintf(u8 *self, int len, char *bf);
int load_kernel(symbol_filter_t filter);