path: root/trace/control.c
diff options
authorDaniel P. Berrange <berrange@redhat.com>2016-10-04 14:35:42 +0100
committerStefan Hajnoczi <stefanha@redhat.com>2016-10-12 09:35:53 +0200
commit6a1b0f3aea09142cb8989ccffb3b74bb8808a00f (patch)
treee92e911b9783cdff602181b1c5d9e6089c23eba1 /trace/control.c
parent170f75ad80115c509d3bedfcbbf4a8237ff6f771 (diff)
trace: add trace event iterator APIs
Currently methods which want to iterate over trace events, do so using the trace_event_count() and trace_event_id() methods. This leaks the concept of a single ID enum to the callers. There is an alternative trace_event_pattern() method which can be used in an iteration context, but its design is stateless, so is not easy to expand it in the future. This defines a formal iterator API will provide a future- proof way of iterating over events. The iterator is also able to apply a pattern match filter to events, further removing the need for the pattern Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Reviewed-by: LluĂ­s Vilanova <vilanova@ac.upc.edu> Signed-off-by: Daniel P. Berrange <berrange@redhat.com> Message-id: 1475588159-30598-4-git-send-email-berrange@redhat.com Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Diffstat (limited to 'trace/control.c')
1 files changed, 21 insertions, 0 deletions
diff --git a/trace/control.c b/trace/control.c
index 10b3e9baba..5a9bb5a8c7 100644
--- a/trace/control.c
+++ b/trace/control.c
@@ -125,6 +125,27 @@ TraceEvent *trace_event_pattern(const char *pat, TraceEvent *ev)
return NULL;
+void trace_event_iter_init(TraceEventIter *iter, const char *pattern)
+ iter->event = 0;
+ iter->pattern = pattern;
+TraceEvent *trace_event_iter_next(TraceEventIter *iter)
+ while (iter->event < TRACE_EVENT_COUNT) {
+ TraceEvent *ev = &(trace_events[iter->event]);
+ iter->event++;
+ if (!iter->pattern ||
+ pattern_glob(iter->pattern,
+ trace_event_get_name(ev))) {
+ return ev;
+ }
+ }
+ return NULL;
void trace_list_events(void)
int i;