mirror of
https://git.zx2c4.com/wireguard-go
synced 2025-09-18 20:57:50 +02:00
device: move stats fields back down and add test diagnostics
This reverts the movement of fields from d49f4e9
.
That commit was cherry-picked from another branch where a field
had changed and misaligned the atomic fields. After cherry-picking,
moving the fields was no longer necessary but got dragged along.
Signed-off-by: David Crawshaw <crawshaw@tailscale.com>
This commit is contained in:
parent
f6020a2085
commit
a4657f996d
@ -21,6 +21,14 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type Peer struct {
|
type Peer struct {
|
||||||
|
// Mostly protects endpoint, but is generally taken whenever we modify peer
|
||||||
|
sync.RWMutex
|
||||||
|
keypairs Keypairs
|
||||||
|
handshake Handshake
|
||||||
|
device *Device
|
||||||
|
endpoint conn.Endpoint
|
||||||
|
persistentKeepaliveInterval uint16
|
||||||
|
|
||||||
// These fields are accessed with atomic operations, which must be
|
// These fields are accessed with atomic operations, which must be
|
||||||
// 64-bit aligned even on 32-bit platforms. Go guarantees that an
|
// 64-bit aligned even on 32-bit platforms. Go guarantees that an
|
||||||
// allocated struct will be 64-bit aligned. So we place
|
// allocated struct will be 64-bit aligned. So we place
|
||||||
@ -35,14 +43,6 @@ type Peer struct {
|
|||||||
// bits. Don't place other atomic fields after this one.
|
// bits. Don't place other atomic fields after this one.
|
||||||
isRunning AtomicBool
|
isRunning AtomicBool
|
||||||
|
|
||||||
// Mostly protects endpoint, but is generally taken whenever we modify peer
|
|
||||||
sync.RWMutex
|
|
||||||
keypairs Keypairs
|
|
||||||
handshake Handshake
|
|
||||||
device *Device
|
|
||||||
endpoint conn.Endpoint
|
|
||||||
persistentKeepaliveInterval uint16
|
|
||||||
|
|
||||||
timers struct {
|
timers struct {
|
||||||
retransmitHandshake *Timer
|
retransmitHandshake *Timer
|
||||||
sendKeepalive *Timer
|
sendKeepalive *Timer
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
package device
|
package device
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"reflect"
|
||||||
"testing"
|
"testing"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
)
|
)
|
||||||
@ -24,6 +25,19 @@ func checkAlignment(t *testing.T, name string, offset uintptr) {
|
|||||||
// hard segfault at runtime.
|
// hard segfault at runtime.
|
||||||
func TestPeerAlignment(t *testing.T) {
|
func TestPeerAlignment(t *testing.T) {
|
||||||
var p Peer
|
var p Peer
|
||||||
|
|
||||||
|
typ := reflect.TypeOf(p)
|
||||||
|
t.Logf("Peer type size: %d, with fields:", typ.Size())
|
||||||
|
for i := 0; i < typ.NumField(); i++ {
|
||||||
|
field := typ.Field(i)
|
||||||
|
t.Logf("\t%30s\toffset=%3v\t(type size=%3d, align=%d)",
|
||||||
|
field.Name,
|
||||||
|
field.Offset,
|
||||||
|
field.Type.Size(),
|
||||||
|
field.Type.Align(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
checkAlignment(t, "Peer.stats", unsafe.Offsetof(p.stats))
|
checkAlignment(t, "Peer.stats", unsafe.Offsetof(p.stats))
|
||||||
checkAlignment(t, "Peer.isRunning", unsafe.Offsetof(p.isRunning))
|
checkAlignment(t, "Peer.isRunning", unsafe.Offsetof(p.isRunning))
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user