From df3f83d1f7aecf8142077f44d69464a05b72baf0 Mon Sep 17 00:00:00 2001 From: Jack Christensen Date: Wed, 26 Dec 2018 15:35:13 -0600 Subject: [PATCH] Store resource creation time --- pool.go | 17 +++++++++++++---- pool_test.go | 1 + 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/pool.go b/pool.go index 6a015a8..b128adb 100644 --- a/pool.go +++ b/pool.go @@ -21,9 +21,10 @@ type Constructor func(ctx context.Context) (res interface{}, err error) type Destructor func(res interface{}) type Resource struct { - value interface{} - pool *Pool - status byte + value interface{} + pool *Pool + creationTime time.Time + status byte } func (res *Resource) Value() interface{} { @@ -53,6 +54,14 @@ func (res *Resource) Hijack() { res.pool.hijackAcquiredResource(res) } +// CreationTime returns when the resource was created by the pool. +func (res *Resource) CreationTime() time.Time { + if res.status != resourceStatusAcquired { + panic("tried to use resource that is not acquired") + } + return res.creationTime +} + // Pool is a thread-safe resource pool. type Pool struct { cond *sync.Cond @@ -232,7 +241,7 @@ func (p *Pool) Acquire(ctx context.Context) (*Resource, error) { // If there is room to create a resource do so if len(p.allResources) < p.maxSize { - res := &Resource{pool: p, status: resourceStatusConstructing} + res := &Resource{pool: p, creationTime: startTime, status: resourceStatusConstructing} p.allResources = append(p.allResources, res) p.destructWG.Add(1) p.cond.L.Unlock() diff --git a/pool_test.go b/pool_test.go index ce99a84..542dc6d 100644 --- a/pool_test.go +++ b/pool_test.go @@ -76,6 +76,7 @@ func TestPoolAcquireCreatesResourceWhenNoneIdle(t *testing.T) { res, err := pool.Acquire(context.Background()) require.NoError(t, err) assert.Equal(t, 1, res.Value()) + assert.WithinDuration(t, time.Now(), res.CreationTime(), time.Second) res.Release() }