Skip to content

Commit d1789c9

Browse files
committed
recycle pcb in next waitio
1 parent 2fcc590 commit d1789c9

File tree

1 file changed

+9
-2
lines changed

1 file changed

+9
-2
lines changed

watcher.go

+9-2
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ type watcher struct {
5151
pendingCreate []*aiocb
5252
pendingProcessing []*aiocb // swaped pending
5353
pendingMutex sync.Mutex
54+
recycles []*aiocb
5455

5556
// IO-completion events to user
5657
chResults chan *aiocb
@@ -179,15 +180,21 @@ func (w *watcher) notifyPending() {
179180
// WaitIO blocks until any read/write completion, or error.
180181
// An internal 'buf' returned or 'r []OpResult' are safe to use BEFORE next call to WaitIO().
181182
func (w *watcher) WaitIO() (r []OpResult, err error) {
183+
// recycle previous aiocb
184+
for k := range w.recycles {
185+
aiocbPool.Put(w.recycles[k])
186+
}
187+
w.recycles = w.recycles[:0]
188+
182189
for {
183190
select {
184191
case pcb := <-w.chResults:
185192
r = append(r, OpResult{Operation: pcb.op, Conn: pcb.conn, IsSwapBuffer: pcb.useSwap, Buffer: pcb.buffer, Size: pcb.size, Error: pcb.err, Context: pcb.ctx})
186-
aiocbPool.Put(pcb)
193+
w.recycles = append(w.recycles, pcb)
187194
for len(w.chResults) > 0 {
188195
pcb := <-w.chResults
189196
r = append(r, OpResult{Operation: pcb.op, Conn: pcb.conn, IsSwapBuffer: pcb.useSwap, Buffer: pcb.buffer, Size: pcb.size, Error: pcb.err, Context: pcb.ctx})
190-
aiocbPool.Put(pcb)
197+
w.recycles = append(w.recycles, pcb)
191198
}
192199

193200
atomic.CompareAndSwapInt32(&w.shouldSwap, 0, 1)

0 commit comments

Comments
 (0)