From 60387b191fb8b0dc109ed42c420ad32ecd8310e7 Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Sat, 4 May 2024 01:46:39 +0800 Subject: [PATCH] replay: fix hang issue on system wake-up (#32341) fix hang issue on system wake-up old-commit-hash: c0a2ce31ee5c16545fbb3c9489f80abb9a2ae4a0 --- tools/replay/replay.cc | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/tools/replay/replay.cc b/tools/replay/replay.cc index 43aef7b881..6a159aa8e2 100644 --- a/tools/replay/replay.cc +++ b/tools/replay/replay.cc @@ -468,12 +468,15 @@ std::vector::const_iterator Replay::publishEvents(std::vector::con // Skip events if socket is not present if (!sockets_[evt.which]) continue; - int64_t time_diff = (evt.mono_time - evt_start_ts) / speed_ - (nanos_since_boot() - loop_start_ts); - // if time_diff is greater than 1 second, it means that an invalid segment is skipped - if (time_diff >= 1e9 || speed_ != prev_replay_speed) { - // reset event start times + const uint64_t current_nanos = nanos_since_boot(); + const int64_t time_diff = (evt.mono_time - evt_start_ts) / speed_ - (current_nanos - loop_start_ts); + + // Reset timestamps for potential synchronization issues: + // - A negative time_diff may indicate slow execution or system wake-up, + // - A time_diff exceeding 1 second suggests a skipped segment. + if ((time_diff < -1e9 || time_diff >= 1e9) || speed_ != prev_replay_speed) { evt_start_ts = evt.mono_time; - loop_start_ts = nanos_since_boot(); + loop_start_ts = current_nanos; prev_replay_speed = speed_; } else if (time_diff > 0) { precise_nano_sleep(time_diff);