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 | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/lib/trace-cmd/trace-timesync.c b/lib/trace-cmd/trace-timesync.c index d38ee975..1e8ba509 100644 --- a/lib/trace-cmd/trace-timesync.c +++ b/lib/trace-cmd/trace-timesync.c @@ -571,6 +571,7 @@ void tracecmd_tsync_free(struct tracecmd_time_sync *tsync) } 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); @@ -753,6 +754,7 @@ 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; int i; @@ -777,6 +779,10 @@ static int tsync_with_guest(struct tracecmd_time_sync *tsync) if (ret) break; } + if (first) { + first = false; + pthread_barrier_wait(&tsync->first_sync); + } if (end || i < tsync->vcpu_count) break; if (tsync->loop_interval > 0) { @@ -804,12 +810,17 @@ static int tsync_with_guest(struct tracecmd_time_sync *tsync) static void *tsync_host_thread(void *data) { struct tracecmd_time_sync *tsync = NULL; + int ret; tsync = (struct tracecmd_time_sync *)data; - tsync_with_guest(tsync); + ret = tsync_with_guest(tsync); tracecmd_msg_handle_close(tsync->msg_handle); tsync->msg_handle = NULL; + /* tsync with guest failed, release the barrier */ + if (ret) + pthread_barrier_wait(&tsync->first_sync); + pthread_exit(0); } @@ -868,6 +879,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); @@ -878,6 +890,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