From bdd815ebc9209e11947353a12557558e81f4e5d5 Mon Sep 17 00:00:00 2001 From: "M. J. Fromberger" Date: Thu, 30 Sep 2021 10:53:05 -0700 Subject: [PATCH] Align atomic struct field for compatibility in 32-bit ABIs. (#7037) The layout of struct fields means that interior fields may not be properly aligned for 64-bit access. Fixes #7000. --- internal/p2p/conn/connection.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/internal/p2p/conn/connection.go b/internal/p2p/conn/connection.go index dc5bacc39..339ad7469 100644 --- a/internal/p2p/conn/connection.go +++ b/internal/p2p/conn/connection.go @@ -751,13 +751,18 @@ func (chDesc ChannelDescriptor) FillDefaults() (filled ChannelDescriptor) { // TODO: lowercase. // NOTE: not goroutine-safe. type Channel struct { + // Exponential moving average. + // This field must be accessed atomically. + // It is first in the struct to ensure correct alignment. + // See https://github.com/tendermint/tendermint/issues/7000. + recentlySent int64 + conn *MConnection desc ChannelDescriptor sendQueue chan []byte sendQueueSize int32 // atomic. recving []byte sending []byte - recentlySent int64 // exponential moving average maxPacketMsgPayloadSize int