|
@@ -60,9 +60,10 @@ TraceEvent *trace_event_name(const char *name)
|
|
|
{
|
|
|
assert(name != NULL);
|
|
|
|
|
|
- TraceEventID i;
|
|
|
- for (i = 0; i < trace_event_count(); i++) {
|
|
|
- TraceEvent *ev = trace_event_id(i);
|
|
|
+ TraceEventIter iter;
|
|
|
+ TraceEvent *ev;
|
|
|
+ trace_event_iter_init(&iter, NULL);
|
|
|
+ while ((ev = trace_event_iter_next(&iter)) != NULL) {
|
|
|
if (strcmp(trace_event_get_name(ev), name) == 0) {
|
|
|
return ev;
|
|
|
}
|
|
@@ -105,21 +106,18 @@ TraceEvent *trace_event_pattern(const char *pat, TraceEvent *ev)
|
|
|
{
|
|
|
assert(pat != NULL);
|
|
|
|
|
|
- TraceEventID i;
|
|
|
-
|
|
|
- if (ev == NULL) {
|
|
|
- i = -1;
|
|
|
- } else {
|
|
|
- i = trace_event_get_id(ev);
|
|
|
- }
|
|
|
- i++;
|
|
|
-
|
|
|
- while (i < trace_event_count()) {
|
|
|
- TraceEvent *res = trace_event_id(i);
|
|
|
- if (pattern_glob(pat, trace_event_get_name(res))) {
|
|
|
- return res;
|
|
|
+ bool matched = ev ? false : true;
|
|
|
+ TraceEventIter iter;
|
|
|
+ TraceEvent *thisev;
|
|
|
+ trace_event_iter_init(&iter, pat);
|
|
|
+ while ((thisev = trace_event_iter_next(&iter)) != NULL) {
|
|
|
+ if (matched) {
|
|
|
+ return thisev;
|
|
|
+ } else {
|
|
|
+ if (ev == thisev) {
|
|
|
+ matched = true;
|
|
|
+ }
|
|
|
}
|
|
|
- i++;
|
|
|
}
|
|
|
|
|
|
return NULL;
|
|
@@ -148,10 +146,11 @@ TraceEvent *trace_event_iter_next(TraceEventIter *iter)
|
|
|
|
|
|
void trace_list_events(void)
|
|
|
{
|
|
|
- int i;
|
|
|
- for (i = 0; i < trace_event_count(); i++) {
|
|
|
- TraceEvent *res = trace_event_id(i);
|
|
|
- fprintf(stderr, "%s\n", trace_event_get_name(res));
|
|
|
+ TraceEventIter iter;
|
|
|
+ TraceEvent *ev;
|
|
|
+ trace_event_iter_init(&iter, NULL);
|
|
|
+ while ((ev = trace_event_iter_next(&iter)) != NULL) {
|
|
|
+ fprintf(stderr, "%s\n", trace_event_get_name(ev));
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -159,26 +158,32 @@ static void do_trace_enable_events(const char *line_buf)
|
|
|
{
|
|
|
const bool enable = ('-' != line_buf[0]);
|
|
|
const char *line_ptr = enable ? line_buf : line_buf + 1;
|
|
|
+ TraceEventIter iter;
|
|
|
+ TraceEvent *ev;
|
|
|
+ bool is_pattern = trace_event_is_pattern(line_ptr);
|
|
|
|
|
|
- if (trace_event_is_pattern(line_ptr)) {
|
|
|
- TraceEvent *ev = NULL;
|
|
|
- while ((ev = trace_event_pattern(line_ptr, ev)) != NULL) {
|
|
|
- if (trace_event_get_state_static(ev)) {
|
|
|
- trace_event_set_state_dynamic_init(ev, enable);
|
|
|
+ trace_event_iter_init(&iter, line_ptr);
|
|
|
+ while ((ev = trace_event_iter_next(&iter)) != NULL) {
|
|
|
+ if (!trace_event_get_state_static(ev)) {
|
|
|
+ if (!is_pattern) {
|
|
|
+ error_report("WARNING: trace event '%s' is not traceable",
|
|
|
+ line_ptr);
|
|
|
+ return;
|
|
|
}
|
|
|
+ continue;
|
|
|
}
|
|
|
- } else {
|
|
|
- TraceEvent *ev = trace_event_name(line_ptr);
|
|
|
- if (ev == NULL) {
|
|
|
- error_report("WARNING: trace event '%s' does not exist",
|
|
|
- line_ptr);
|
|
|
- } else if (!trace_event_get_state_static(ev)) {
|
|
|
- error_report("WARNING: trace event '%s' is not traceable",
|
|
|
- line_ptr);
|
|
|
- } else {
|
|
|
- trace_event_set_state_dynamic_init(ev, enable);
|
|
|
+
|
|
|
+ /* start tracing */
|
|
|
+ trace_event_set_state_dynamic(ev, enable);
|
|
|
+ if (!is_pattern) {
|
|
|
+ return;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ if (!is_pattern) {
|
|
|
+ error_report("WARNING: trace event '%s' does not exist",
|
|
|
+ line_ptr);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
void trace_enable_events(const char *line_buf)
|