All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Daniel P. Berrange" <berrange@redhat.com>
To: qemu-devel@nongnu.org
Cc: Stefan Hajnoczi <stefanha@redhat.com>,
	"Daniel P. Berrange" <berrange@redhat.com>
Subject: [Qemu-devel] [PATCH for-2.8 v1 06/60] trace: convert code to use event iterators
Date: Tue,  9 Aug 2016 16:31:34 +0100	[thread overview]
Message-ID: <1470756748-18933-7-git-send-email-berrange@redhat.com> (raw)
In-Reply-To: <1470756748-18933-1-git-send-email-berrange@redhat.com>

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 <berrange@redhat.com>
---
 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

  parent reply	other threads:[~2016-08-09 15:32 UTC|newest]

Thread overview: 113+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-08-09 15:31 [Qemu-devel] [PATCH for-2.8 v1 00/60] Modular build of trace event files Daniel P. Berrange
2016-08-09 15:31 ` [Qemu-devel] [PATCH for-2.8 v1 01/60] trace: move util/buffer.c trace points into correct file Daniel P. Berrange
2016-08-09 15:31 ` [Qemu-devel] [PATCH for-2.8 v1 02/60] trace: move util/qemu-coroutine*.c " Daniel P. Berrange
2016-08-09 15:31 ` [Qemu-devel] [PATCH for-2.8 v1 03/60] trace: move hw/mem/pc-dimm.c " Daniel P. Berrange
2016-08-09 15:31 ` [Qemu-devel] [PATCH for-2.8 v1 04/60] trace: move hw/virtio/virtio-balloon.c " Daniel P. Berrange
2016-09-08 18:09   ` Eric Blake
2016-09-14 14:50     ` Daniel P. Berrange
2016-08-09 15:31 ` [Qemu-devel] [PATCH for-2.8 v1 05/60] trace: add trace event iterator APIs Daniel P. Berrange
2016-09-02 20:52   ` Stefan Hajnoczi
2016-09-14 12:32     ` Daniel P. Berrange
2016-08-09 15:31 ` Daniel P. Berrange [this message]
2016-09-02 20:55   ` [Qemu-devel] [PATCH for-2.8 v1 06/60] trace: convert code to use event iterators Stefan Hajnoczi
2016-08-09 15:31 ` [Qemu-devel] [PATCH for-2.8 v1 07/60] trace: remove some now unused functions Daniel P. Berrange
2016-08-09 15:31 ` [Qemu-devel] [PATCH for-2.8 v1 08/60] trace: provide mechanism for registering trace events Daniel P. Berrange
2016-08-09 16:17   ` Paolo Bonzini
2016-08-09 16:18     ` Daniel P. Berrange
2016-08-09 15:31 ` [Qemu-devel] [PATCH for-2.8 v1 09/60] trace: remove use of TRACE_VCPU_EVENT_COUNT in cpu.h Daniel P. Berrange
2016-09-02 21:03   ` Stefan Hajnoczi
2016-08-09 15:31 ` [Qemu-devel] [PATCH for-2.8 v1 10/60] trace: remove fixed global event state arrays Daniel P. Berrange
2016-08-10 14:00   ` Lluís Vilanova
2016-08-10 14:47     ` Daniel P. Berrange
2016-08-10 16:13       ` Lluís Vilanova
2016-08-09 15:31 ` [Qemu-devel] [PATCH for-2.8 v1 11/60] trace: remove use of event ID enums from APIs Daniel P. Berrange
2016-08-09 16:18   ` Paolo Bonzini
2016-08-09 16:24     ` Daniel P. Berrange
2016-08-09 16:26       ` Paolo Bonzini
2016-09-02 21:13         ` Stefan Hajnoczi
2016-09-14 12:32           ` Daniel P. Berrange
2016-08-09 15:31 ` [Qemu-devel] [PATCH for-2.8 v1 12/60] trace: use -1 instead of TRACE_VCPU_EVENT_COUNT as magic value Daniel P. Berrange
2016-08-09 15:31 ` [Qemu-devel] [PATCH for-2.8 v1 13/60] trace: remove generated-events.h from many includes Daniel P. Berrange
2016-08-09 15:31 ` [Qemu-devel] [PATCH for-2.8 v1 14/60] trace: get rid of generated-events.h/generated-events.c Daniel P. Berrange
2016-08-09 15:31 ` [Qemu-devel] [PATCH for-2.8 v1 15/60] trace: introduce a formal group name for trace events Daniel P. Berrange
2016-08-09 15:31 ` [Qemu-devel] [PATCH for-2.8 v1 16/60] trace: introduce ID range offsets per trace-events file Daniel P. Berrange
2016-08-09 15:31 ` [Qemu-devel] [PATCH for-2.8 v1 17/60] trace: introduce some Makefile rules for module code gen Daniel P. Berrange
2016-08-10 14:18   ` Lluís Vilanova
2016-08-10 14:48     ` Daniel P. Berrange
2016-08-09 15:31 ` [Qemu-devel] [PATCH for-2.8 v1 18/60] trace: switch io/ directory to modular trace.h file Daniel P. Berrange
2016-08-09 15:31 ` [Qemu-devel] [PATCH for-2.8 v1 19/60] trace: switch util/ " Daniel P. Berrange
2016-08-09 15:31 ` [Qemu-devel] [PATCH for-2.8 v1 20/60] trace: switch crypto/ " Daniel P. Berrange
2016-08-09 15:31 ` [Qemu-devel] [PATCH for-2.8 v1 21/60] trace: switch migration/ " Daniel P. Berrange
2016-08-09 15:31 ` [Qemu-devel] [PATCH for-2.8 v1 22/60] trace: switch block/ " Daniel P. Berrange
2016-08-09 15:31 ` [Qemu-devel] [PATCH for-2.8 v1 23/60] trace: switch hw/block/ " Daniel P. Berrange
2016-08-09 15:31 ` [Qemu-devel] [PATCH for-2.8 v1 24/60] trace: switch hw/char/ " Daniel P. Berrange
2016-08-09 15:31 ` [Qemu-devel] [PATCH for-2.8 v1 25/60] trace: switch hw/intc/ " Daniel P. Berrange
2016-08-09 15:31 ` [Qemu-devel] [PATCH for-2.8 v1 26/60] trace: switch hw/net/ " Daniel P. Berrange
2016-08-09 15:31 ` [Qemu-devel] [PATCH for-2.8 v1 27/60] trace: switch hw/virtio/ " Daniel P. Berrange
2016-08-09 15:31 ` [Qemu-devel] [PATCH for-2.8 v1 28/60] trace: switch hw/audio/ " Daniel P. Berrange
2016-08-09 15:31 ` [Qemu-devel] [PATCH for-2.8 v1 29/60] trace: switch hw/misc/ " Daniel P. Berrange
2016-08-09 15:31 ` [Qemu-devel] [PATCH for-2.8 v1 30/60] trace: switch hw/usb/ " Daniel P. Berrange
2016-08-09 15:31 ` [Qemu-devel] [PATCH for-2.8 v1 31/60] trace: switch hw/scsi/ " Daniel P. Berrange
2016-08-09 15:32 ` [Qemu-devel] [PATCH for-2.8 v1 32/60] trace: switch hw/nvram/ " Daniel P. Berrange
2016-08-09 15:32 ` [Qemu-devel] [PATCH for-2.8 v1 33/60] trace: switch hw/display/ " Daniel P. Berrange
2016-08-09 15:32 ` [Qemu-devel] [PATCH for-2.8 v1 34/60] trace: switch hw/input/ " Daniel P. Berrange
2016-08-09 15:32 ` [Qemu-devel] [PATCH for-2.8 v1 35/60] trace: switch hw/timer/ " Daniel P. Berrange
2016-08-09 15:32 ` [Qemu-devel] [PATCH for-2.8 v1 36/60] trace: switch hw/dma/ " Daniel P. Berrange
2016-08-09 15:32 ` [Qemu-devel] [PATCH for-2.8 v1 37/60] trace: switch hw/sparc/ " Daniel P. Berrange
2016-08-09 15:32 ` [Qemu-devel] [PATCH for-2.8 v1 38/60] trace: switch hw/sd/ " Daniel P. Berrange
2016-08-09 15:32 ` [Qemu-devel] [PATCH for-2.8 v1 39/60] trace: switch hw/isa/ " Daniel P. Berrange
2016-08-09 15:32 ` [Qemu-devel] [PATCH for-2.8 v1 40/60] trace: switch hw/mem/ " Daniel P. Berrange
2016-08-09 15:32 ` [Qemu-devel] [PATCH for-2.8 v1 41/60] trace: switch hw/i386/ " Daniel P. Berrange
2016-08-09 15:32 ` [Qemu-devel] [PATCH for-2.8 v1 42/60] trace: switch hw/9pfs/ " Daniel P. Berrange
2016-08-09 15:32 ` [Qemu-devel] [PATCH for-2.8 v1 43/60] trace: switch hw/ppc/ " Daniel P. Berrange
2016-08-09 15:32 ` [Qemu-devel] [PATCH for-2.8 v1 44/60] trace: switch hw/pci/ " Daniel P. Berrange
2016-08-09 15:32 ` [Qemu-devel] [PATCH for-2.8 v1 45/60] trace: switch hw/s390x/ " Daniel P. Berrange
2016-08-09 15:32 ` [Qemu-devel] [PATCH for-2.8 v1 46/60] trace: switch hw/vfio/ " Daniel P. Berrange
2016-08-09 15:32 ` [Qemu-devel] [PATCH for-2.8 v1 47/60] trace: switch hw/acpi/ " Daniel P. Berrange
2016-08-09 15:32 ` [Qemu-devel] [PATCH for-2.8 v1 48/60] trace: switch hw/arm/ " Daniel P. Berrange
2016-08-09 15:32 ` [Qemu-devel] [PATCH for-2.8 v1 49/60] trace: switch hw/alpha/ " Daniel P. Berrange
2016-08-09 15:32 ` [Qemu-devel] [PATCH for-2.8 v1 50/60] trace: switch ui/ " Daniel P. Berrange
2016-08-09 15:32 ` [Qemu-devel] [PATCH for-2.8 v1 51/60] trace: switch audio/ " Daniel P. Berrange
2016-08-09 15:32 ` [Qemu-devel] [PATCH for-2.8 v1 52/60] trace: switch net/ " Daniel P. Berrange
2016-08-09 15:32 ` [Qemu-devel] [PATCH for-2.8 v1 53/60] trace: switch target-i386/ " Daniel P. Berrange
2016-08-09 15:32 ` [Qemu-devel] [PATCH for-2.8 v1 54/60] trace: switch target-sparc/ " Daniel P. Berrange
2016-08-09 15:32 ` [Qemu-devel] [PATCH for-2.8 v1 55/60] trace: switch target-s390x/ " Daniel P. Berrange
2016-08-09 15:32 ` [Qemu-devel] [PATCH for-2.8 v1 56/60] trace: switch target-ppc/ " Daniel P. Berrange
2016-08-09 15:32 ` [Qemu-devel] [PATCH for-2.8 v1 57/60] trace: switch qom/ " Daniel P. Berrange
2016-08-09 15:32 ` [Qemu-devel] [PATCH for-2.8 v1 58/60] trace: switch linux-user/ " Daniel P. Berrange
2016-08-09 15:32 ` [Qemu-devel] [PATCH for-2.8 v1 59/60] trace: remove the global include/trace.h file Daniel P. Berrange
2016-08-09 15:32 ` [Qemu-devel] [PATCH for-2.8 v1 60/60] trace: update docs to reflect new code generation approach Daniel P. Berrange
2016-08-10 14:33   ` Lluís Vilanova
2016-08-10 14:51     ` Daniel P. Berrange
2016-08-10 16:11       ` Lluís Vilanova
2016-08-11  8:13         ` Daniel P. Berrange
2016-08-11 10:11           ` Lluís Vilanova
2016-09-02 21:24             ` Stefan Hajnoczi
2016-09-14 12:34               ` Daniel P. Berrange
2016-08-09 17:03 ` [Qemu-devel] [PATCH for-2.8 v1 00/60] Modular build of trace event files no-reply
2016-08-09 17:11   ` Daniel P. Berrange
2016-08-10  1:41     ` Fam Zheng
2016-08-10  8:06       ` Daniel P. Berrange
2016-08-10  8:13         ` Fam Zheng
2016-08-10  8:24           ` Daniel P. Berrange
2016-08-10  8:39             ` Fam Zheng
2016-08-10  8:50               ` Daniel P. Berrange
2016-08-10 15:54               ` Paolo Bonzini
2016-08-10  1:58     ` Fam Zheng
2016-08-10 14:05 ` Lluís Vilanova
2016-08-10 14:52   ` Daniel P. Berrange
2016-09-08 13:23 ` Lluís Vilanova
2016-09-08 13:43   ` Daniel P. Berrange
2016-09-09 11:03     ` Lluís Vilanova
2016-09-09 12:08       ` Daniel P. Berrange
2016-09-09 13:16         ` Lluís Vilanova
2016-09-13 17:53           ` Daniel P. Berrange
2016-09-14 13:20             ` Lluís Vilanova
2016-09-13 17:08   ` Daniel P. Berrange
2016-09-13 18:36     ` Lluís Vilanova
2016-09-14  8:25       ` Daniel P. Berrange
2016-09-14 13:26         ` Lluís Vilanova
2016-09-13 14:54 ` Stefan Hajnoczi
2016-09-13 15:10   ` Daniel P. Berrange
2016-09-13 16:05     ` Lluís Vilanova
2016-09-13 16:27       ` Daniel P. Berrange

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1470756748-18933-7-git-send-email-berrange@redhat.com \
    --to=berrange@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.