diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2016-08-28 21:00:18 +0200 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2016-08-28 21:00:18 +0200 |
| commit | 26a5cf9efa8d0fc4ffbf2f9810241d4fdead8e16 (patch) | |
| tree | 0a75b8b70288aecea2b4080f2ed4ce4bede853a9 /vm | |
| parent | e9d2eec662c0e4fb3f9da6329118e8b7c7a5002a (diff) | |
vm: fix potential deadlock in OutputMerger
Diffstat (limited to 'vm')
| -rw-r--r-- | vm/merger.go | 14 |
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() |
