diff mbox series

tracecmd library: Unlock records in tracecmd_iterate_events()

Message ID 20230606145231.77820ea6@gandalf.local.home (mailing list archive)
State Accepted
Commit 890855541c412bcaf9412f86a9e969431782f1c3
Headers show
Series tracecmd library: Unlock records in tracecmd_iterate_events() | expand

Commit Message

Steven Rostedt June 6, 2023, 6:52 p.m. UTC
From: "Steven Rostedt (Google)" <rostedt@goodmis.org>

The tracecmd_iterate_events() and tracecmd_iterate_events_multi() uses
tracecmd_peek_data() to look at the next record. But when this is done,
the record is "cached" and "locked" in the handle. Which means they can
not be freed.

At the end of the iterators, make sure to read the data to unlock them,
and then free them.

Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
---
 lib/trace-cmd/trace-input.c | 22 ++++++++++++++++++++--
 1 file changed, 20 insertions(+), 2 deletions(-)
diff mbox series

Patch

diff --git a/lib/trace-cmd/trace-input.c b/lib/trace-cmd/trace-input.c
index 3dd13ce45fef..ced016a221ca 100644
--- a/lib/trace-cmd/trace-input.c
+++ b/lib/trace-cmd/trace-input.c
@@ -2818,8 +2818,13 @@  int tracecmd_iterate_events(struct tracecmd_input *handle,
 		}
 	} while (next_cpu >= 0 && ret >= 0);
 
-	for (cpu = 0; cpu < handle->max_cpu; cpu++)
-		tracecmd_free_record(records[cpu]);
+	/* Need to unlock and free the records */
+	for (cpu = 0; cpu < handle->max_cpu; cpu++) {
+		if (!records[cpu])
+			continue;
+		record = tracecmd_read_data(handle, cpu);
+		tracecmd_free_record(record);
+	}
 
 	free(records);
 
@@ -2909,6 +2914,19 @@  int tracecmd_iterate_events_multi(struct tracecmd_input **handles,
 
 	} while (next_cpu >= 0 && ret >= 0);
 
+	/* Unlock and free the records */
+	for (cpu = 0; cpu < all_cpus; cpu++) {
+		int local_cpu;
+
+		if (!records[cpu].record)
+			continue;
+
+		handle = records[cpu].handle;
+		local_cpu = cpu - handle->start_cpu;
+		record = tracecmd_read_data(handle, local_cpu);
+		tracecmd_free_record(record);
+	}
+
 	/*
 	 * The records array contains only records that were taken via
 	 * tracecmd_peek_data(), and do not need to be freed.