From 0ca762e0e2a82a668dc505c659fb0daede868b98 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Tue, 11 Dec 2018 09:17:10 +0100 Subject: [PATCH] fix a deadlock in cacheReader. fix #1471 --- app/dispatcher/default.go | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/app/dispatcher/default.go b/app/dispatcher/default.go index dceba917..7930321a 100644 --- a/app/dispatcher/default.go +++ b/app/dispatcher/default.go @@ -46,13 +46,22 @@ func (r *cachedReader) Cache(b *buf.Buffer) { r.Unlock() } -func (r *cachedReader) ReadMultiBuffer() (buf.MultiBuffer, error) { +func (r *cachedReader) readInternal() buf.MultiBuffer { r.Lock() defer r.Unlock() if r.cache != nil && !r.cache.IsEmpty() { mb := r.cache r.cache = nil + return mb + } + + return nil +} + +func (r *cachedReader) ReadMultiBuffer() (buf.MultiBuffer, error) { + mb := r.readInternal() + if mb != nil { return mb, nil } @@ -60,12 +69,8 @@ func (r *cachedReader) ReadMultiBuffer() (buf.MultiBuffer, error) { } func (r *cachedReader) ReadMultiBufferTimeout(timeout time.Duration) (buf.MultiBuffer, error) { - r.Lock() - defer r.Unlock() - - if r.cache != nil && !r.cache.IsEmpty() { - mb := r.cache - r.cache = nil + mb := r.readInternal() + if mb != nil { return mb, nil }