Added a barrier in time synchronization threads to ensure the first time synchronization passed before to start the trace. Signed-off-by: Tzvetomir Stoyanov (VMware) <tz.stoyanov@xxxxxxxxx> --- lib/trace-cmd/trace-timesync.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/lib/trace-cmd/trace-timesync.c b/lib/trace-cmd/trace-timesync.c index 0c90b413..4c03052d 100644 --- a/lib/trace-cmd/trace-timesync.c +++ b/lib/trace-cmd/trace-timesync.c @@ -534,6 +534,7 @@ void tracecmd_tsync_free(struct tracecmd_time_sync *tsync) tsync_context->sync_size = 0; 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); @@ -645,12 +646,15 @@ static int tsync_with_guest(struct tracecmd_time_sync *tsync) int ts_array_size = CLOCK_TS_ARRAY; struct tsync_proto *proto; struct timespec timeout; + bool first = true; bool end = false; int ret; clock_context_init(tsync, &proto, false); - if (!tsync->context) + if (!tsync->context) { + pthread_barrier_wait(&tsync->first_sync); return -1; + } if (tsync->loop_interval > 0 && tsync->loop_interval < (CLOCK_TS_ARRAY * 1000)) @@ -663,6 +667,10 @@ static int tsync_with_guest(struct tracecmd_time_sync *tsync) TRACECMD_TIME_SYNC_CMD_PROBE, 0, NULL); ret = tsync_get_sample(tsync, proto, ts_array_size); + if (first) { + first = false; + pthread_barrier_wait(&tsync->first_sync); + } if (ret || end) break; if (tsync->loop_interval > 0) { @@ -754,6 +762,7 @@ tracecmd_tsync_with_guest(unsigned long long trace_id, int loop_interval, tsync->clock_str = strdup(clock); pthread_mutex_init(&tsync->lock, NULL); pthread_cond_init(&tsync->cond, NULL); + pthread_barrier_init(&tsync->first_sync, NULL, 2); pthread_attr_init(&attrib); pthread_attr_setdetachstate(&attrib, PTHREAD_CREATE_JOINABLE); @@ -764,6 +773,7 @@ tracecmd_tsync_with_guest(unsigned long long trace_id, int loop_interval, if (!get_first_cpu(&pin_mask, &mask_size)) pthread_setaffinity_np(tsync->thread, mask_size, pin_mask); + pthread_barrier_wait(&tsync->first_sync); if (pin_mask) CPU_FREE(pin_mask); -- 2.29.2