From 78ebce69324e241d462d624cae389396db9dbd94 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Tue, 9 Feb 2021 09:08:17 -0800 Subject: [PATCH] device: only allocate peer queues once This serves two purposes. First, it makes repeatedly stopping then starting a peer cheaper. Second, it prevents a data race observed accessing the queues. Signed-off-by: Josh Bleecher Snyder --- device/peer.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/device/peer.go b/device/peer.go index 96481ee..222c74f 100644 --- a/device/peer.go +++ b/device/peer.go @@ -179,10 +179,10 @@ func (peer *Peer) Start() { peer.handshake.lastSentHandshake = time.Now().Add(-(RekeyTimeout + time.Second)) peer.handshake.mutex.Unlock() - // prepare queues - peer.queue.outbound = newAutodrainingOutboundQueue(device) - peer.queue.inbound = newAutodrainingInboundQueue(device) - if peer.queue.staged == nil { + // prepare queues (once) + if peer.queue.outbound == nil { + peer.queue.outbound = newAutodrainingOutboundQueue(device) + peer.queue.inbound = newAutodrainingInboundQueue(device) peer.queue.staged = make(chan *QueueOutboundElement, QueueStagedSize) } peer.device.queue.encryption.wg.Add(1) // keep encryption queue open for our writes