aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2016-08-28 21:00:18 +0200
committerDmitry Vyukov <dvyukov@google.com>2016-08-28 21:00:18 +0200
commit26a5cf9efa8d0fc4ffbf2f9810241d4fdead8e16 (patch)
tree0a75b8b70288aecea2b4080f2ed4ce4bede853a9
parente9d2eec662c0e4fb3f9da6329118e8b7c7a5002a (diff)
vm: fix potential deadlock in OutputMerger
-rw-r--r--vm/merger.go14
1 files changed, 10 insertions, 4 deletions
diff --git a/vm/merger.go b/vm/merger.go
index b19326ef6..2effd0f45 100644
--- a/vm/merger.go
+++ b/vm/merger.go
@@ -41,9 +41,12 @@ func (merger *OutputMerger) Add(r io.ReadCloser) {
if merger.tee != nil {
merger.tee.Write(out)
}
- merger.Output <- append([]byte{}, out...)
- r := copy(pending[:], pending[pos+1:])
- pending = pending[:r]
+ select {
+ case merger.Output <- append([]byte{}, out...):
+ r := copy(pending[:], pending[pos+1:])
+ pending = pending[:r]
+ default:
+ }
}
}
if err != nil {
@@ -52,7 +55,10 @@ func (merger *OutputMerger) Add(r io.ReadCloser) {
if merger.tee != nil {
merger.tee.Write(pending)
}
- merger.Output <- pending
+ select {
+ case merger.Output <- pending:
+ default:
+ }
}
r.Close()
merger.wg.Done()