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; 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(ev, enable); } } } 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(ev, enable); } } }
static void trace_init_events(const char *fname) { Location loc; FILE *fp; char line_buf[1024]; size_t line_idx = 0; if (fname == NULL) { return; } loc_push_none(&loc); loc_set_file(fname, 0); fp = fopen(fname, "r"); if (!fp) { error_report("%s", strerror(errno)); exit(1); } while (fgets(line_buf, sizeof(line_buf), fp)) { loc_set_file(fname, ++line_idx); size_t len = strlen(line_buf); if (len > 1) { /* skip empty lines */ line_buf[len - 1] = '\0'; if ('#' == line_buf[0]) { /* skip commented lines */ continue; } const bool enable = ('-' != line_buf[0]); char *line_ptr = enable ? line_buf : line_buf + 1; 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(ev, enable); } } } 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\n", line_ptr); } else { trace_event_set_state_dynamic(ev, enable); } } } } if (fclose(fp) != 0) { loc_set_file(fname, 0); error_report("%s", strerror(errno)); exit(1); } loc_pop(&loc); }
static bool check_events(bool has_vcpu, bool ignore_unavailable, bool is_pattern, const char *name, Error **errp) { if (!is_pattern) { TraceEvent *ev = trace_event_name(name); /* error for non-existing event */ if (ev == NULL) { error_setg(errp, "unknown event \"%s\"", name); return false; } /* error for non-vcpu event */ if (has_vcpu && !trace_event_is_vcpu(ev)) { error_setg(errp, "event \"%s\" is not vCPU-specific", name); return false; } /* error for unavailable event */ if (!ignore_unavailable && !trace_event_get_state_static(ev)) { error_setg(errp, "event \"%s\" is disabled", name); return false; } return true; } else { /* error for unavailable events */ TraceEventIter iter; TraceEvent *ev; trace_event_iter_init(&iter, name); while ((ev = trace_event_iter_next(&iter)) != NULL) { if (!ignore_unavailable && !trace_event_get_state_static(ev)) { error_setg(errp, "event \"%s\" is disabled", trace_event_get_name(ev)); return false; } } return true; } }