From d83b67b4a8fc887ba5690c206d4cb8846f1aae6b Mon Sep 17 00:00:00 2001 From: Jack Christensen Date: Wed, 26 Dec 2018 14:09:49 -0600 Subject: [PATCH] Fix use waitgroup after close race --- pool.go | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/pool.go b/pool.go index 3b19a5b..c16ee50 100644 --- a/pool.go +++ b/pool.go @@ -183,12 +183,14 @@ func (p *Pool) Acquire(ctx context.Context) (*Resource, error) { if len(p.allResources) < p.maxSize { res := &Resource{pool: p, status: resourceStatusConstructing} p.allResources = append(p.allResources, res) + p.destructWG.Add(1) p.cond.L.Unlock() value, err := p.constructResourceValue(ctx) p.cond.L.Lock() if err != nil { p.allResources = removeResource(p.allResources, res) + p.destructWG.Done() p.cond.L.Unlock() return nil, err } @@ -289,12 +291,7 @@ func removeResource(slice []*Resource, res *Resource) []*Resource { } func (p *Pool) constructResourceValue(ctx context.Context) (interface{}, error) { - value, err := p.constructor(ctx) - if err != nil { - return nil, err - } - p.destructWG.Add(1) - return value, nil + return p.constructor(ctx) } func (p *Pool) destructResourceValue(value interface{}) {