aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteven Rostedt (Google) <rostedt@goodmis.org>2022-04-06 11:56:38 -0400
committerSteven Rostedt (Google) <rostedt@goodmis.org>2022-04-06 19:18:38 -0400
commit6e136e46032ea6286e051fc50ff8be8142784124 (patch)
tree7c5dab8582b1b7a0689c20b7c52a8d49a72b7922
parent2efc9575a663ed10ef83d12fe96870c04042de91 (diff)
downloadtrace-cmd-6e136e46032ea6286e051fc50ff8be8142784124.tar.gz
trace-cmd library: Do not free pthread items from agent
The agent creates a tsync to synchronize with the host as well as the host synchronizing with the guest. The host uses pthread synchronization items (mutex, cond and barrier) to synchronize its tracing threads as it needs to retrieve the data that is produced from them. While debugging the agent, the forked connection would always fail with a SIGFPE, Arithmetic exception. This was caused by calling pthread_barrier_destroy() against a barrier that never was initialized. Since the pthread_mutex, pthread_cond, and pthread_barriers are only initialized by the host, skip the freeing of them (which both the host and guest call the same function to free: tracecmd_tsync_free()), if the guest_id is zero. Link: https://lore.kernel.org/linux-trace-devel/20220406115638.44303e6a@gandalf.local.home Fixes: 3c2d7f97245f1 ("trace-cmd: Wait for first time sync before the trace") Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
-rw-r--r--lib/trace-cmd/trace-timesync.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/lib/trace-cmd/trace-timesync.c b/lib/trace-cmd/trace-timesync.c
index f8ec15a3..beaa87d1 100644
--- a/lib/trace-cmd/trace-timesync.c
+++ b/lib/trace-cmd/trace-timesync.c
@@ -583,9 +583,13 @@ void tracecmd_tsync_free(struct tracecmd_time_sync *tsync)
if (tsync->msg_handle)
tracecmd_msg_handle_close(tsync->msg_handle);
- pthread_mutex_destroy(&tsync->lock);
- pthread_cond_destroy(&tsync->cond);
- pthread_barrier_destroy(&tsync->first_sync);
+ /* These are only created from the host */
+ if (tsync->guest_pid) {
+ pthread_mutex_destroy(&tsync->lock);
+ pthread_cond_destroy(&tsync->cond);
+ pthread_barrier_destroy(&tsync->first_sync);
+ }
+
free(tsync->clock_str);
free(tsync->proto_name);
free(tsync);