]> git.ipfire.org Git - thirdparty/wireguard-go.git/commitdiff
device: preallocated buffers scheme
authorJason A. Donenfeld <Jason@zx2c4.com>
Sun, 16 Sep 2018 21:10:19 +0000 (23:10 +0200)
committerJason A. Donenfeld <Jason@zx2c4.com>
Sun, 16 Sep 2018 21:10:19 +0000 (23:10 +0200)
Not useful now but quite possibly later.

device.go

index 2245a616142d8735c73aa6acc59b9acb7245f010..b1f3569d05e89238ccd2027880ec9a8706d14a15 100644 (file)
--- a/device.go
+++ b/device.go
@@ -19,6 +19,9 @@ const (
        DeviceRoutineNumberAdditional = 2
 )
 
+
+const preallocatedBuffers = 0
+
 type Device struct {
        isUp     AtomicBool // device is (going) up
        isClosed AtomicBool // device is closed? (acting as guard)
@@ -66,7 +69,8 @@ type Device struct {
        }
 
        pool struct {
-               messageBuffers sync.Pool
+               messageBuffers *sync.Pool
+               reuseChan      chan interface{}
        }
 
        queue struct {
@@ -243,11 +247,19 @@ func (device *Device) SetPrivateKey(sk NoisePrivateKey) error {
 }
 
 func (device *Device) GetMessageBuffer() *[MaxMessageSize]byte {
-       return device.pool.messageBuffers.Get().(*[MaxMessageSize]byte)
+       if preallocatedBuffers == 0 {
+               return device.pool.messageBuffers.Get().(*[MaxMessageSize]byte)
+       } else {
+               return (<-device.pool.reuseChan).(*[MaxMessageSize]byte)
+       }
 }
 
 func (device *Device) PutMessageBuffer(msg *[MaxMessageSize]byte) {
-       device.pool.messageBuffers.Put(msg)
+       if preallocatedBuffers == 0 {
+               device.pool.messageBuffers.Put(msg)
+       } else {
+               device.pool.reuseChan <- msg
+       }
 }
 
 func NewDevice(tunDevice tun.TUNDevice, logger *Logger) *Device {
@@ -274,10 +286,17 @@ func NewDevice(tunDevice tun.TUNDevice, logger *Logger) *Device {
        device.indexTable.Init()
        device.allowedips.Reset()
 
-       device.pool.messageBuffers = sync.Pool{
-               New: func() interface{} {
-                       return new([MaxMessageSize]byte)
-               },
+       if preallocatedBuffers == 0 {
+               device.pool.messageBuffers = &sync.Pool{
+                       New: func() interface{} {
+                               return new([MaxMessageSize]byte)
+                       },
+               }
+       } else {
+               device.pool.reuseChan = make(chan interface{}, preallocatedBuffers)
+               for i := 0; i < preallocatedBuffers; i += 1 {
+                       device.pool.reuseChan <- new([MaxMessageSize]byte)
+               }
        }
 
        // create queues