Пример #1
0
/**
 * parse_events - parse a perf style string with events
 * @el: List of events allocated earlier
 * @events: Comma separated lists of events. {} style groups are legal.
 *
 * JSON events are supported, if the event lists are downloaded first.
 */
int parse_events(struct eventlist *el, char *events)
{
	char *s, *tmp;

	events = strdup(events);
	if (! events) return -1;
	for (s = strtok_r(events, ",", &tmp);
	     s;
	     s = strtok_r(NULL, ",", &tmp)) {
		bool group_leader = false, end_group = false;
		int len;

		if (s[0] == '{') {
			s++;
			group_leader = true;
		} else if (len = strlen(s), len > 0 && s[len - 1] == '}') {
			s[len - 1] = 0;
			end_group = true;
		}

		struct event *e = new_event(el, s);
		e->group_leader = group_leader;
		e->end_group = end_group;
		if (resolve_event(s, &e->attr) < 0) {
			fprintf(stderr, "Cannot resolve %s\n", e->event);
			return -1;
		}
	}
	free(events);
	return 0;
}
Пример #2
0
int main(int ac, char **av)
{
	int test = 0;
	int ret = 0;

	while (*++av) {
		if (!strcmp(*av, "--test")) {
			test = 1;
			continue;
		}

		struct perf_event_attr attr;
		if (resolve_event(*av, &attr) < 0) {
			fprintf(stderr, "Cannot resolve %s\n", *av); 
			ret = 1;
			continue;
		}
		char *ev = format_raw_event(&attr, *av);
		printf("%s\n", ev);
		free(ev);
		if (test) {
			if (syscall(__NR_perf_event_open, &attr, 0, -1, -1, 0) < 0)
				perror("perf_event_open");
		}
	}
	return ret;
}