1 #include <linux/types.h>
6 static pid_t event__synthesize_comm(pid_t pid, int full,
7 int (*process)(event_t *event))
10 char filename[PATH_MAX];
15 struct dirent dirent, *next;
18 snprintf(filename, sizeof(filename), "/proc/%d/status", pid);
20 fp = fopen(filename, "r");
24 * We raced with a task exiting - just return:
26 pr_debug("couldn't open %s\n", filename);
30 memset(&ev.comm, 0, sizeof(ev.comm));
31 while (!ev.comm.comm[0] || !ev.comm.pid) {
32 if (fgets(bf, sizeof(bf), fp) == NULL)
35 if (memcmp(bf, "Name:", 5) == 0) {
37 while (*name && isspace(*name))
39 size = strlen(name) - 1;
40 memcpy(ev.comm.comm, name, size++);
41 } else if (memcmp(bf, "Tgid:", 5) == 0) {
43 while (*tgids && isspace(*tgids))
45 tgid = ev.comm.pid = atoi(tgids);
49 ev.comm.header.type = PERF_RECORD_COMM;
50 size = ALIGN(size, sizeof(u64));
51 ev.comm.header.size = sizeof(ev.comm) - (sizeof(ev.comm.comm) - size);
60 snprintf(filename, sizeof(filename), "/proc/%d/task", pid);
62 tasks = opendir(filename);
66 while (!readdir_r(tasks, &dirent, &next) && next) {
68 pid = strtol(dirent.d_name, &end, 10);
83 pr_warning("couldn't get COMM and pgid, malformed %s\n", filename);
87 static int event__synthesize_mmap_events(pid_t pid, pid_t tgid,
88 int (*process)(event_t *event))
90 char filename[PATH_MAX];
93 snprintf(filename, sizeof(filename), "/proc/%d/maps", pid);
95 fp = fopen(filename, "r");
98 * We raced with a task exiting - just return:
100 pr_debug("couldn't open %s\n", filename);
105 char bf[BUFSIZ], *pbf = bf;
107 .header = { .type = PERF_RECORD_MMAP },
111 if (fgets(bf, sizeof(bf), fp) == NULL)
114 /* 00400000-0040c000 r-xp 00000000 fd:01 41038 /bin/cat */
115 n = hex2u64(pbf, &ev.mmap.start);
119 n = hex2u64(pbf, &ev.mmap.len);
123 if (*pbf == 'x') { /* vm_exec */
124 char *execname = strchr(bf, '/');
127 if (execname == NULL)
128 execname = strstr(bf, "[vdso]");
130 if (execname == NULL)
133 size = strlen(execname);
134 execname[size - 1] = '\0'; /* Remove \n */
135 memcpy(ev.mmap.filename, execname, size);
136 size = ALIGN(size, sizeof(u64));
137 ev.mmap.len -= ev.mmap.start;
138 ev.mmap.header.size = (sizeof(ev.mmap) -
139 (sizeof(ev.mmap.filename) - size));
151 int event__synthesize_thread(pid_t pid, int (*process)(event_t *event))
153 pid_t tgid = event__synthesize_comm(pid, 1, process);
156 return event__synthesize_mmap_events(pid, tgid, process);
159 void event__synthesize_threads(int (*process)(event_t *event))
162 struct dirent dirent, *next;
164 proc = opendir("/proc");
166 while (!readdir_r(proc, &dirent, &next) && next) {
168 pid_t pid = strtol(dirent.d_name, &end, 10);
170 if (*end) /* only interested in proper numerical dirents */
173 event__synthesize_thread(pid, process);