aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--device/peer.go16
-rw-r--r--device/peer_test.go14
2 files changed, 22 insertions, 8 deletions
diff --git a/device/peer.go b/device/peer.go
index a96f261..cb348d5 100644
--- a/device/peer.go
+++ b/device/peer.go
@@ -21,6 +21,14 @@ const (
)
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
// 64-bit aligned even on 32-bit platforms. Go guarantees that an
// 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.
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 {
retransmitHandshake *Timer
sendKeepalive *Timer
diff --git a/device/peer_test.go b/device/peer_test.go
index de87ab6..b389f1e 100644
--- a/device/peer_test.go
+++ b/device/peer_test.go
@@ -6,6 +6,7 @@
package device
import (
+ "reflect"
"testing"
"unsafe"
)
@@ -24,6 +25,19 @@ func checkAlignment(t *testing.T, name string, offset uintptr) {
// hard segfault at runtime.
func TestPeerAlignment(t *testing.T) {
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.isRunning", unsafe.Offsetof(p.isRunning))
}