goroutine fairness is not guaranteed causing the hang with GCCGO

Signed-off-by: Srini Brahmaroutu <srbrahma@us.ibm.com>
This commit is contained in:
Srini Brahmaroutu 2015-09-25 00:13:38 +00:00
parent ad3c33e73d
commit 2d0927a08b

View file

@ -84,6 +84,9 @@ func NewBufReaderWithDrainbufAndBuffer(r io.Reader, drainBuffer []byte, buffer i
func (r *bufReader) drain() { func (r *bufReader) drain() {
for { 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) n, err := r.reader.Read(r.drainBuf)
r.Lock() r.Lock()
if err != nil { if err != nil {
@ -98,7 +101,6 @@ func (r *bufReader) drain() {
} }
r.wait.Signal() r.wait.Signal()
r.Unlock() r.Unlock()
callSchedulerIfNecessary()
if err != nil { if err != nil {
break break
} }