Fixed a data race quic_alarm.cc. Tested with 10K runs: http://sponge2/b5abb08b-b006-465b-943b-f7fc477c5aed (The test failure is from a different reason) PiperOrigin-RevId: 394799609
diff --git a/quic/core/quic_alarm.cc b/quic/core/quic_alarm.cc index 67e0a74..22e2e67 100644 --- a/quic/core/quic_alarm.cc +++ b/quic/core/quic_alarm.cc
@@ -4,6 +4,8 @@ #include "quic/core/quic_alarm.h" +#include <atomic> + #include "quic/platform/api/quic_bug_tracker.h" #include "quic/platform/api/quic_flag_utils.h" #include "quic/platform/api/quic_flags.h" @@ -17,9 +19,9 @@ QuicAlarm::~QuicAlarm() { if (GetQuicRestartFlag(quic_alarm_add_permanent_cancel) && IsSet()) { QUIC_CODE_COUNT(quic_alarm_not_cancelled_in_dtor); - static uint64_t hit_count = 0; - ++hit_count; - if ((hit_count & (hit_count - 1)) == 0) { + static std::atomic<uint64_t> hit_count{0}; + uint64_t old_count = hit_count.fetch_add(1, std::memory_order_relaxed); + if ((old_count & (old_count + 1)) == 0) { QUIC_LOG(ERROR) << "QuicAlarm not cancelled at destruction. " << QuicStackTrace(); }