Преглед изворни кода

transport/pipe/impl.go: Remove runtime.Gosched() in WriteMultiBuffer() (#5467)

风扇滑翔翼 пре 2 недеља
родитељ
комит
d9025857fe
1 измењених фајлова са 18 додато и 27 уклоњено
  1. 18 27
      transport/pipe/impl.go

+ 18 - 27
transport/pipe/impl.go

@@ -3,7 +3,6 @@ package pipe
 import (
 import (
 	"errors"
 	"errors"
 	"io"
 	"io"
-	"runtime"
 	"sync"
 	"sync"
 	"time"
 	"time"
 
 
@@ -136,11 +135,10 @@ func (p *pipe) writeMultiBufferInternal(mb buf.MultiBuffer) error {
 
 
 	if p.data == nil {
 	if p.data == nil {
 		p.data = mb
 		p.data = mb
-		return nil
+	} else {
+		p.data, _ = buf.MergeMulti(p.data, mb)
 	}
 	}
-
-	p.data, _ = buf.MergeMulti(p.data, mb)
-	return errSlowDown
+	return nil
 }
 }
 
 
 func (p *pipe) WriteMultiBuffer(mb buf.MultiBuffer) error {
 func (p *pipe) WriteMultiBuffer(mb buf.MultiBuffer) error {
@@ -155,30 +153,23 @@ func (p *pipe) WriteMultiBuffer(mb buf.MultiBuffer) error {
 			return nil
 			return nil
 		}
 		}
 
 
-		if err == errSlowDown {
-			p.readSignal.Signal()
-
-			// Yield current goroutine. Hopefully the reading counterpart can pick up the payload.
-			runtime.Gosched()
-			return nil
-		}
-
-		if err == errBufferFull && p.option.discardOverflow {
-			buf.ReleaseMulti(mb)
-			return nil
+		if err == errBufferFull {
+			if p.option.discardOverflow {
+				buf.ReleaseMulti(mb)
+				return nil
+			}
+			select {
+			case <-p.writeSignal.Wait():
+				continue
+			case <-p.done.Wait():
+				buf.ReleaseMulti(mb)
+				return io.ErrClosedPipe
+			}
 		}
 		}
 
 
-		if err != errBufferFull {
-			buf.ReleaseMulti(mb)
-			p.readSignal.Signal()
-			return err
-		}
-
-		select {
-		case <-p.writeSignal.Wait():
-		case <-p.done.Wait():
-			return io.ErrClosedPipe
-		}
+		buf.ReleaseMulti(mb)
+		p.readSignal.Signal()
+		return err
 	}
 	}
 }
 }