From 2db6acd48b1a7ebc365e3fb192f7b9baeb05d423 Mon Sep 17 00:00:00 2001 From: Robert Obryk Date: Fri, 29 Mar 2013 11:00:50 +0100 Subject: [PATCH] Fix a race condition in bufReader. The race condition cen be detected by running existing bufReader tests with Go's race detector. Upstream-commit: d52451bcf887790df5a6a7cbbc7305747535eb11 Component: engine --- components/engine/utils.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/components/engine/utils.go b/components/engine/utils.go index e479f472bd..1c61f12cad 100644 --- a/components/engine/utils.go +++ b/components/engine/utils.go @@ -174,12 +174,12 @@ func (r *bufReader) drain() { buf := make([]byte, 1024) for { n, err := r.reader.Read(buf) + r.l.Lock() if err != nil { r.err = err } else { r.buf.Write(buf[0:n]) } - r.l.Lock() r.wait.Signal() r.l.Unlock() if err != nil { @@ -189,6 +189,8 @@ func (r *bufReader) drain() { } func (r *bufReader) Read(p []byte) (n int, err error) { + r.l.Lock() + defer r.l.Unlock() for { n, err = r.buf.Read(p) if n > 0 { @@ -197,9 +199,7 @@ func (r *bufReader) Read(p []byte) (n int, err error) { if r.err != nil { return 0, r.err } - r.l.Lock() r.wait.Wait() - r.l.Unlock() } return }