Sfoglia il codice sorgente

goroutine fairness is not guaranteed causing the hang with GCCGO
Signed-off-by: Srini Brahmaroutu <srbrahma@us.ibm.com>

Srini Brahmaroutu 9 anni fa
parent
commit
7c52fcce85
1 ha cambiato i file con 3 aggiunte e 1 eliminazioni
  1. 3 1
      pkg/ioutils/readers.go

+ 3 - 1
pkg/ioutils/readers.go

@@ -84,6 +84,9 @@ func NewBufReaderWithDrainbufAndBuffer(r io.Reader, drainBuffer []byte, buffer i
 
 func (r *bufReader) drain() {
 	for {
+		//Call to scheduler is made to yield from this goroutine.
+		//This avoids goroutine looping here when n=0,err=nil, fixes code hangs when run with GCC Go.
+		callSchedulerIfNecessary()
 		n, err := r.reader.Read(r.drainBuf)
 		r.Lock()
 		if err != nil {
@@ -98,7 +101,6 @@ func (r *bufReader) drain() {
 		}
 		r.wait.Signal()
 		r.Unlock()
-		callSchedulerIfNecessary()
 		if err != nil {
 			break
 		}