Skip to content

Commit d5f17ab

Browse files
authored
Try to optimize pipe performance
1 parent a610a4c commit d5f17ab

File tree

1 file changed

+18
-27
lines changed

1 file changed

+18
-27
lines changed

transport/pipe/impl.go

Lines changed: 18 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package pipe
33
import (
44
"errors"
55
"io"
6-
"runtime"
76
"sync"
87
"time"
98

@@ -136,11 +135,10 @@ func (p *pipe) writeMultiBufferInternal(mb buf.MultiBuffer) error {
136135

137136
if p.data == nil {
138137
p.data = mb
139-
return nil
138+
} else {
139+
p.data, _ = buf.MergeMulti(p.data, mb)
140140
}
141-
142-
p.data, _ = buf.MergeMulti(p.data, mb)
143-
return errSlowDown
141+
return nil
144142
}
145143

146144
func (p *pipe) WriteMultiBuffer(mb buf.MultiBuffer) error {
@@ -155,30 +153,23 @@ func (p *pipe) WriteMultiBuffer(mb buf.MultiBuffer) error {
155153
return nil
156154
}
157155

158-
if err == errSlowDown {
159-
p.readSignal.Signal()
160-
161-
// Yield current goroutine. Hopefully the reading counterpart can pick up the payload.
162-
runtime.Gosched()
163-
return nil
164-
}
165-
166-
if err == errBufferFull && p.option.discardOverflow {
167-
buf.ReleaseMulti(mb)
168-
return nil
156+
if err == errBufferFull {
157+
if p.option.discardOverflow {
158+
buf.ReleaseMulti(mb)
159+
return nil
160+
}
161+
select {
162+
case <-p.writeSignal.Wait():
163+
continue
164+
case <-p.done.Wait():
165+
buf.ReleaseMulti(mb)
166+
return io.ErrClosedPipe
167+
}
169168
}
170169

171-
if err != errBufferFull {
172-
buf.ReleaseMulti(mb)
173-
p.readSignal.Signal()
174-
return err
175-
}
176-
177-
select {
178-
case <-p.writeSignal.Wait():
179-
case <-p.done.Wait():
180-
return io.ErrClosedPipe
181-
}
170+
buf.ReleaseMulti(mb)
171+
p.readSignal.Signal()
172+
return err
182173
}
183174
}
184175

0 commit comments

Comments
 (0)