コード例 #1
0
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;
}
コード例 #2
0
ファイル: lib.c プロジェクト: s-kanev/misc
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;
}