static void write_event(event_t *buf, size_t size) { /* * Add it to the list of DSOs, so that when we finish this * record session we can pick the available build-ids. */ if (buf->header.type == PERF_RECORD_MMAP) dsos__findnew(buf->mmap.filename); write_output(buf, size); }
struct map *map__new(struct mmap_event *event, enum map_type type, char *cwd, int cwdlen) { struct map *self = malloc(sizeof(*self)); if (self != NULL) { const char *filename = event->filename; char newfilename[PATH_MAX]; struct dso *dso; int anon; if (cwd) { int n = strcommon(filename, cwd, cwdlen); if (n == cwdlen) { snprintf(newfilename, sizeof(newfilename), ".%s", filename + n); filename = newfilename; } } anon = is_anon_memory(filename); if (anon) { snprintf(newfilename, sizeof(newfilename), "/tmp/perf-%d.map", event->pid); filename = newfilename; } dso = dsos__findnew(filename); if (dso == NULL) goto out_delete; map__init(self, type, event->start, event->start + event->len, event->pgoff, dso); if (anon) { set_identity: self->map_ip = self->unmap_ip = identity__map_ip; } else if (strcmp(filename, "[vdso]") == 0) { dso__set_loaded(dso, self->type); goto set_identity; } } return self; out_delete: free(self); return NULL; }