int perf_setup_list_events(const char *ev, perf_event_desc_t **fd, int *num_fds) { const char **argv; char *p, *q, *events; int i, ret, num = 0; if (!(ev && fd && num_fds)) return -1; events = strdup(ev); if (!events) return -1; q = events; while((p = strchr(q, ','))) { num++; q = p + 1; } num++; num++; /* terminator */ argv = malloc(num * sizeof(char *)); if (!argv) { free(events); return -1; } i = 0; q = events; while((p = strchr(q, ','))) { *p = '\0'; argv[i++] = q; q = p + 1; } argv[i++] = q; argv[i] = NULL; ret = perf_setup_argv_events(argv, fd, num_fds); free(argv); free(events); /* strdup in perf_setup_argv_events() */ return ret; }
int pfm_init_counters(const char** counters) { #ifdef VERBOSE fprintf(stderr, "Initing counters\n"); #endif /* Initialize pfm library */ int i,ret; ret = pfm_initialize(); if (ret != PFM_SUCCESS) { fprintf(stderr, "Cannot initialize libpfm: %s\n", pfm_strerror(ret)); return -1; } ret = perf_setup_argv_events(counters, &fds, &num_fds); if (ret || !num_fds) { fprintf(stderr, "Cannot setup events\n"); return -1; } fds[0].fd = -1; for (i=0; i < num_fds; i++) { /* request timing information necessary for scaling */ fds[i].hw.read_format = PERF_FORMAT_SCALE; fds[i].hw.disabled = 1; /* start paused */ fds[i].fd = perf_event_open(&fds[i].hw, 0, -1, -1, 0); if (fds[i].fd == -1) { fprintf(stderr, "Cannot open event %d\n", i); return -1; } } counter_values = (uint64_t*) malloc(num_fds * sizeof(uint64_t)); return 0; }