void perf_event::set_event_name(const char *event_name) { if (name) free(name); name = strdup(event_name); char *c; c = strchr(name, ':'); if (c) *c = '/'; trace_type = get_trace_type(name); }
void perf_event::set_event_name(const char *event_name) { if (name) free(name); name = strdup(event_name); if (!name) { fprintf(stderr, "failed to allocate event name\n"); return; } char *c; c = strchr(name, ':'); if (c) *c = '/'; trace_type = get_trace_type(name); }
static void create_perf_event(void) { struct perf_event_attr attr; int ret; struct { __u64 count; __u64 time_enabled; __u64 time_running; __u64 id; } read_data; memset(&attr, 0, sizeof(attr)); attr.read_format = PERF_FORMAT_TOTAL_TIME_ENABLED | PERF_FORMAT_TOTAL_TIME_RUNNING | PERF_FORMAT_ID; attr.sample_freq = 0; attr.sample_period = 1; attr.sample_type |= PERF_SAMPLE_RAW; attr.mmap = 1; attr.comm = 1; attr.inherit = 0; attr.disabled = 1; attr.type = PERF_TYPE_TRACEPOINT; attr.config = get_trace_type(); if (attr.config <= 0) return; perf_fd = sys_perf_event_open(&attr, -1, 0, -1, 0); if (perf_fd < 0) { fprintf(stderr, "Perf syscall failed: %i / %i (%s)\n", perf_fd, errno, strerror(errno)); return; } if (read(perf_fd, &read_data, sizeof(read_data)) == -1) { perror("Unable to read perf file descriptor\n"); exit(-1); } fcntl(perf_fd, F_SETFL, O_NONBLOCK); perf_mmap = mmap(NULL, (128+1)*getpagesize(), PROT_READ | PROT_WRITE, MAP_SHARED, perf_fd, 0); if (perf_mmap == MAP_FAILED) { fprintf(stderr, "failed to mmap with %d (%s)\n", errno, strerror(errno)); return; } ret = ioctl(perf_fd, PERF_EVENT_IOC_ENABLE); if (ret < 0) fprintf(stderr, "failed to enable perf \n"); pc = perf_mmap; data_mmap = perf_mmap + getpagesize(); }