From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40904) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bX91J-0006Hv-UR for qemu-devel@nongnu.org; Tue, 09 Aug 2016 11:32:48 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bX91G-0005d6-Qa for qemu-devel@nongnu.org; Tue, 09 Aug 2016 11:32:45 -0400 Received: from mx1.redhat.com ([209.132.183.28]:55932) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bX91G-0005cp-Hc for qemu-devel@nongnu.org; Tue, 09 Aug 2016 11:32:42 -0400 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 29494636FD for ; Tue, 9 Aug 2016 15:32:42 +0000 (UTC) From: "Daniel P. Berrange" Date: Tue, 9 Aug 2016 16:31:34 +0100 Message-Id: <1470756748-18933-7-git-send-email-berrange@redhat.com> In-Reply-To: <1470756748-18933-1-git-send-email-berrange@redhat.com> References: <1470756748-18933-1-git-send-email-berrange@redhat.com> Subject: [Qemu-devel] [PATCH for-2.8 v1 06/60] trace: convert code to use event iterators List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Stefan Hajnoczi , "Daniel P. Berrange" This converts the HMP/QMP monitor API implementations and some internal trace control methods to use the new trace event iterator APIs. Signed-off-by: Daniel P. Berrange --- monitor.c | 16 ++++++---- trace/control.c | 92 +++++++++++++++++++++++++++++++++------------------------ trace/qmp.c | 16 ++++++---- 3 files changed, 73 insertions(+), 51 deletions(-) diff --git a/monitor.c b/monitor.c index 5c00373..7b979a6 100644 --- a/monitor.c +++ b/monitor.c @@ -3335,9 +3335,11 @@ void info_trace_events_completion(ReadLineState *rs, int nb_args, const char *st len = strlen(str); readline_set_completion_index(rs, len); if (nb_args == 2) { - TraceEventID id; - for (id = 0; id < trace_event_count(); id++) { - const char *event_name = trace_event_get_name(trace_event_id(id)); + TraceEventIter iter; + TraceEvent *ev; + trace_event_iter_init(&iter, NULL); + while ((ev = trace_event_iter_next(&iter)) != NULL) { + const char *event_name = trace_event_get_name(ev); if (!strncmp(str, event_name, len)) { readline_add_completion(rs, event_name); } @@ -3352,9 +3354,11 @@ void trace_event_completion(ReadLineState *rs, int nb_args, const char *str) len = strlen(str); readline_set_completion_index(rs, len); if (nb_args == 2) { - TraceEventID id; - for (id = 0; id < trace_event_count(); id++) { - const char *event_name = trace_event_get_name(trace_event_id(id)); + TraceEventIter iter; + TraceEvent *ev; + trace_event_iter_init(&iter, NULL); + while ((ev = trace_event_iter_next(&iter)) != NULL) { + const char *event_name = trace_event_get_name(ev); if (!strncmp(str, event_name, len)) { readline_add_completion(rs, event_name); } diff --git a/trace/control.c b/trace/control.c index deab872..dbf47fc 100644 --- a/trace/control.c +++ b/trace/control.c @@ -59,9 +59,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; } @@ -104,21 +105,20 @@ 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, NULL); + while ((thisev = trace_event_iter_next(&iter)) != NULL) { + if (matched) { + if (pattern_glob(pat, trace_event_get_name(thisev))) { + return thisev; + } + } else { + if (ev == thisev) { + matched = true; + } } - i++; } return NULL; @@ -152,10 +152,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)); } } @@ -163,32 +164,43 @@ 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) { + trace_event_iter_init(&iter, is_pattern ? line_ptr : NULL); + while ((ev = trace_event_iter_next(&iter)) != NULL) { + bool match = false; + if (is_pattern) { if (trace_event_get_state_static(ev)) { - /* start tracing */ - trace_event_set_state_dynamic(ev, enable); - /* mark for late vCPU init */ - trace_events_dstate_init[ev->id] = true; + match = true; } - } - } 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 { + if (g_str_equal(trace_event_get_name(ev), + line_ptr)) { + if (!trace_event_get_state_static(ev)) { + error_report("WARNING: trace event '%s' is not traceable", + line_ptr); + return; + } + match = true; + } + } + if (match) { /* start tracing */ trace_event_set_state_dynamic(ev, enable); /* mark for late vCPU init */ trace_events_dstate_init[ev->id] = true; + 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) @@ -299,8 +311,10 @@ char *trace_opt_parse(const char *optarg) void trace_init_vcpu_events(void) { - TraceEvent *ev = NULL; - while ((ev = trace_event_pattern("*", ev)) != NULL) { + TraceEventIter iter; + TraceEvent *ev; + trace_event_iter_init(&iter, NULL); + while ((ev = trace_event_iter_next(&iter)) != NULL) { if (trace_event_is_vcpu(ev) && trace_event_get_state_static(ev) && trace_events_dstate_init[ev->id]) { diff --git a/trace/qmp.c b/trace/qmp.c index 11d2564..88a907b 100644 --- a/trace/qmp.c +++ b/trace/qmp.c @@ -52,8 +52,10 @@ static bool check_events(bool has_vcpu, bool ignore_unavailable, bool is_pattern return true; } else { /* error for unavailable events */ - TraceEvent *ev = NULL; - while ((ev = trace_event_pattern(name, ev)) != NULL) { + 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; @@ -69,6 +71,7 @@ TraceEventInfoList *qmp_trace_event_get_state(const char *name, { Error *err = NULL; TraceEventInfoList *events = NULL; + TraceEventIter iter; TraceEvent *ev; bool is_pattern = trace_event_is_pattern(name); CPUState *cpu; @@ -86,8 +89,8 @@ TraceEventInfoList *qmp_trace_event_get_state(const char *name, } /* Get states (all errors checked above) */ - ev = NULL; - while ((ev = trace_event_pattern(name, ev)) != NULL) { + trace_event_iter_init(&iter, is_pattern ? name : NULL); + while ((ev = trace_event_iter_next(&iter)) != NULL) { TraceEventInfoList *elem; bool is_vcpu = trace_event_is_vcpu(ev); if (has_vcpu && !is_vcpu) { @@ -132,6 +135,7 @@ void qmp_trace_event_set_state(const char *name, bool enable, Error **errp) { Error *err = NULL; + TraceEventIter iter; TraceEvent *ev; bool is_pattern = trace_event_is_pattern(name); CPUState *cpu; @@ -150,8 +154,8 @@ void qmp_trace_event_set_state(const char *name, bool enable, } /* Apply changes (all errors checked above) */ - ev = NULL; - while ((ev = trace_event_pattern(name, ev)) != NULL) { + trace_event_iter_init(&iter, name); + while ((ev = trace_event_iter_next(&iter)) != NULL) { if (!trace_event_get_state_static(ev) || (has_vcpu && !trace_event_is_vcpu(ev))) { continue; -- 2.7.4