diff --git a/include/spdk/trace_parser.h b/include/spdk/trace_parser.h index 4daf6eabc..de9b4b4aa 100644 --- a/include/spdk/trace_parser.h +++ b/include/spdk/trace_parser.h @@ -102,6 +102,39 @@ const struct spdk_trace_flags *spdk_trace_parser_get_flags(const struct spdk_tra */ uint64_t spdk_trace_parser_get_tsc_offset(const struct spdk_trace_parser *parser); +/** Describes a parsed trace entry */ +struct spdk_trace_parser_entry { + /** Pointer to trace entry */ + struct spdk_trace_entry *entry; + /** + * Index of an object this entry is a part of. It's only available for tracepoints with + * object_type != OBJECT_NONE. If unavailable, it'll be assigned to UINT64_MAX. + */ + uint64_t object_index; + /** The tsc of when the object tied to this entry was created */ + uint64_t object_start; + /** Logical core number */ + uint16_t lcore; + /** Tracepoint arguments */ + union { + uint64_t integer; + void *pointer; + char string[UINT8_MAX + 1]; + } args[SPDK_TRACE_MAX_ARGS_COUNT]; +}; + +/** + * Return next parsed trace entry. Once no more traces are available, this will return false and + * entry won't be touched. + * + * \param parser Parser object to be used. + * \param entry Tracepoint entry. + * + * \return True if a trace entry was available, false otherwise. + */ +bool spdk_trace_parser_next_entry(struct spdk_trace_parser *parser, + struct spdk_trace_parser_entry *entry); + #ifdef __cplusplus } #endif diff --git a/lib/trace_parser/spdk_trace_parser.map b/lib/trace_parser/spdk_trace_parser.map index b10c67388..1c5df9ea2 100644 --- a/lib/trace_parser/spdk_trace_parser.map +++ b/lib/trace_parser/spdk_trace_parser.map @@ -6,6 +6,7 @@ spdk_trace_parser_cleanup; spdk_trace_parser_get_flags; spdk_trace_parser_get_tsc_offset; + spdk_trace_parser_next_entry; local: *; }; diff --git a/lib/trace_parser/trace.cpp b/lib/trace_parser/trace.cpp index 7ce62448e..918d0da49 100644 --- a/lib/trace_parser/trace.cpp +++ b/lib/trace_parser/trace.cpp @@ -68,6 +68,7 @@ struct spdk_trace_parser { spdk_trace_parser &operator=(const spdk_trace_parser &) = delete; const spdk_trace_flags *flags() const { return &_histories->flags; } uint64_t tsc_offset() const { return _tsc_offset; } + bool next_entry(spdk_trace_parser_entry *entry); private: void populate_events(spdk_trace_history *history, int num_entries); bool init(const spdk_trace_parser_opts *opts); @@ -78,8 +79,23 @@ private: int _fd; uint64_t _tsc_offset; entry_map _entries; + entry_map::iterator _iter; }; +bool +spdk_trace_parser::next_entry(spdk_trace_parser_entry *entry) +{ + if (_iter == _entries.end()) { + return false; + } + + entry->entry = _iter->second; + entry->lcore = _iter->first.lcore; + + _iter++; + return true; +} + void spdk_trace_parser::populate_events(spdk_trace_history *history, int num_entries) { @@ -212,6 +228,7 @@ spdk_trace_parser::init(const spdk_trace_parser_opts *opts) } } + _iter = _entries.begin(); return true; } @@ -271,3 +288,10 @@ spdk_trace_parser_get_tsc_offset(const struct spdk_trace_parser *parser) { return parser->tsc_offset(); } + +bool +spdk_trace_parser_next_entry(struct spdk_trace_parser *parser, + struct spdk_trace_parser_entry *entry) +{ + return parser->next_entry(entry); +}