From 1da7dd3da937baeaf0d9d78c3e92d47622791cdb Mon Sep 17 00:00:00 2001 From: Andrew Date: Thu, 9 Feb 2017 01:39:06 -0500 Subject: [PATCH] Improve status table implementation (#879) * Remove superfluous defer calls * Improve status table implementation as well This would probably only help with large, high-traffic installs --- modules/sync/status_pool.go | 20 +++++++++----------- modules/sync/status_pool_test.go | 19 +++++++++++++++++++ modules/sync/unique_queue.go | 2 +- 3 files changed, 29 insertions(+), 12 deletions(-) create mode 100644 modules/sync/status_pool_test.go diff --git a/modules/sync/status_pool.go b/modules/sync/status_pool.go index f6a7f9495..46d15aa08 100644 --- a/modules/sync/status_pool.go +++ b/modules/sync/status_pool.go @@ -14,36 +14,34 @@ import ( // in different goroutines. type StatusTable struct { lock sync.RWMutex - pool map[string]bool + pool map[string]struct{} } // NewStatusTable initializes and returns a new StatusTable object. func NewStatusTable() *StatusTable { return &StatusTable{ - pool: make(map[string]bool), + pool: make(map[string]struct{}), } } // Start sets value of given name to true in the pool. func (p *StatusTable) Start(name string) { p.lock.Lock() - defer p.lock.Unlock() - - p.pool[name] = true + p.pool[name] = struct{}{} + p.lock.Unlock() } // Stop sets value of given name to false in the pool. func (p *StatusTable) Stop(name string) { p.lock.Lock() - defer p.lock.Unlock() - - p.pool[name] = false + delete(p.pool, name) + p.lock.Unlock() } // IsRunning checks if value of given name is set to true in the pool. func (p *StatusTable) IsRunning(name string) bool { p.lock.RLock() - defer p.lock.RUnlock() - - return p.pool[name] + _, ok := p.pool[name] + p.lock.RUnlock() + return ok } diff --git a/modules/sync/status_pool_test.go b/modules/sync/status_pool_test.go new file mode 100644 index 000000000..61e5a2732 --- /dev/null +++ b/modules/sync/status_pool_test.go @@ -0,0 +1,19 @@ +package sync + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func Test_StatusTable(t *testing.T) { + table := NewStatusTable() + + assert.False(t, table.IsRunning("xyz")) + + table.Start("xyz") + assert.True(t, table.IsRunning("xyz")) + + table.Stop("xyz") + assert.False(t, table.IsRunning("xyz")) +} diff --git a/modules/sync/unique_queue.go b/modules/sync/unique_queue.go index 3f3c1c866..7dcaa165a 100644 --- a/modules/sync/unique_queue.go +++ b/modules/sync/unique_queue.go @@ -51,7 +51,7 @@ func (q *UniqueQueue) AddFunc(id interface{}, fn func()) { idStr := com.ToStr(id) q.table.lock.Lock() - q.table.pool[idStr] = true + q.table.pool[idStr] = struct{}{} if fn != nil { fn() }