diff options
author | Andrew <write@imaginarycode.com> | 2017-02-09 01:39:06 -0500 |
---|---|---|
committer | Lunny Xiao <xiaolunwen@gmail.com> | 2017-02-09 14:39:06 +0800 |
commit | 1da7dd3da937baeaf0d9d78c3e92d47622791cdb (patch) | |
tree | ef7658037c1568771b0fc7eb1da5e74e21bfcd6f /modules/sync | |
parent | 13973348df6f8b47b9b757882d3917dbf30d32e8 (diff) | |
download | gitea-1da7dd3da937baeaf0d9d78c3e92d47622791cdb.tar.gz gitea-1da7dd3da937baeaf0d9d78c3e92d47622791cdb.zip |
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
Diffstat (limited to 'modules/sync')
-rw-r--r-- | modules/sync/status_pool.go | 20 | ||||
-rw-r--r-- | modules/sync/status_pool_test.go | 19 | ||||
-rw-r--r-- | modules/sync/unique_queue.go | 2 |
3 files changed, 29 insertions, 12 deletions
diff --git a/modules/sync/status_pool.go b/modules/sync/status_pool.go index f6a7f9495c..46d15aa08c 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 0000000000..61e5a27329 --- /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 3f3c1c8661..7dcaa165a8 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() } |