Mesa (main): util/trace: Fix u_trace_*_iterator with no tracepoints
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Wed Jul 27 20:15:22 UTC 2022
Module: Mesa
Branch: main
Commit: 0a4c86fc44a64eba9f35820e9b7e5b0a651a081f
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=0a4c86fc44a64eba9f35820e9b7e5b0a651a081f
Author: Connor Abbott <cwabbott0 at gmail.com>
Date: Fri Jul 8 12:36:59 2022 +0200
util/trace: Fix u_trace_*_iterator with no tracepoints
If u_trace is empty then there are no chunks, and we didn't account for
that case.
This fixes tracing some dynamic rendering tests.
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17378>
---
src/util/perf/u_trace.c | 28 ++++++++++++++++++++++++++++
1 file changed, 28 insertions(+)
diff --git a/src/util/perf/u_trace.c b/src/util/perf/u_trace.c
index ce2b3d411e6..e92ed08856a 100644
--- a/src/util/perf/u_trace.c
+++ b/src/util/perf/u_trace.c
@@ -619,6 +619,9 @@ u_trace_begin_iterator(struct u_trace *ut)
if (!ut->enabled)
return (struct u_trace_iterator) {NULL, NULL, 0};
+ if (list_is_empty(&ut->trace_chunks))
+ return (struct u_trace_iterator) { ut, NULL, 0 };
+
struct u_trace_chunk *first_chunk =
list_first_entry(&ut->trace_chunks, struct u_trace_chunk, node);
@@ -631,16 +634,35 @@ u_trace_end_iterator(struct u_trace *ut)
if (!ut->enabled)
return (struct u_trace_iterator) {NULL, NULL, 0};
+ if (list_is_empty(&ut->trace_chunks))
+ return (struct u_trace_iterator) { ut, NULL, 0 };
+
struct u_trace_chunk *last_chunk =
list_last_entry(&ut->trace_chunks, struct u_trace_chunk, node);
return (struct u_trace_iterator) { ut, last_chunk, last_chunk->num_traces};
}
+/* If an iterator was created when there were no chunks and there are now
+ * chunks, "sanitize" it to include the first chunk.
+ */
+static struct u_trace_iterator
+sanitize_iterator(struct u_trace_iterator iter)
+{
+ if (iter.ut && !iter.chunk && !list_is_empty(&iter.ut->trace_chunks)) {
+ iter.chunk = list_first_entry(&iter.ut->trace_chunks, struct
+ u_trace_chunk, node);
+ }
+
+ return iter;
+}
+
bool
u_trace_iterator_equal(struct u_trace_iterator a,
struct u_trace_iterator b)
{
+ a = sanitize_iterator(a);
+ b = sanitize_iterator(b);
return a.ut == b.ut &&
a.chunk == b.chunk &&
a.event_idx == b.event_idx;
@@ -653,6 +675,9 @@ u_trace_clone_append(struct u_trace_iterator begin_it,
void *cmdstream,
u_trace_copy_ts_buffer copy_ts_buffer)
{
+ begin_it = sanitize_iterator(begin_it);
+ end_it = sanitize_iterator(end_it);
+
struct u_trace_chunk *from_chunk = begin_it.chunk;
uint32_t from_idx = begin_it.event_idx;
@@ -702,6 +727,9 @@ void
u_trace_disable_event_range(struct u_trace_iterator begin_it,
struct u_trace_iterator end_it)
{
+ begin_it = sanitize_iterator(begin_it);
+ end_it = sanitize_iterator(end_it);
+
struct u_trace_chunk *current_chunk = begin_it.chunk;
uint32_t start_idx = begin_it.event_idx;
More information about the mesa-commit
mailing list