package pool
import (
"bytes"
"time"
"github.com/lightningnetwork/lnd/buffer"
)
type Write struct {
workerPool *Worker
bufferPool *WriteBuffer
}
func NewWrite(writeBufferPool *WriteBuffer, numWorkers int,
workerTimeout time.Duration) *Write {
w := &Write{
bufferPool: writeBufferPool,
}
w.workerPool = NewWorker(&WorkerConfig{
NewWorkerState: w.newWorkerState,
NumWorkers: numWorkers,
WorkerTimeout: workerTimeout,
})
return w
}
func (w *Write) Start() error {
return w.workerPool.Start()
}
func (w *Write) Stop() error {
return w.workerPool.Stop()
}
func (w *Write) Submit(inner func(*bytes.Buffer) error) error {
return w.workerPool.Submit(func(s WorkerState) error {
state := s.(*writeWorkerState)
return inner(state.buf)
})
}
type writeWorkerState struct {
bufferPool *WriteBuffer
writeBuf *buffer.Write
buf *bytes.Buffer
}
func (w *Write) newWorkerState() WorkerState {
writeBuf := w.bufferPool.Take()
return &writeWorkerState{
bufferPool: w.bufferPool,
writeBuf: writeBuf,
buf: bytes.NewBuffer(writeBuf[0:0:len(writeBuf)]),
}
}
func (w *writeWorkerState) Cleanup() {
w.bufferPool.Return(w.writeBuf)
w.writeBuf = nil
w.buf = nil
}
func (w *writeWorkerState) Reset() {
w.buf.Reset()
}