device: preallocated buffers scheme
Not useful now but quite possibly later.
This commit is contained in:
		
							parent
							
								
									39d6e4f2f1
								
							
						
					
					
						commit
						47d1140361
					
				
							
								
								
									
										33
									
								
								device.go
									
									
									
									
									
								
							
							
						
						
									
										33
									
								
								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
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user