mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-11-04 12:53:43 +01:00 
			
		
		
		
	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
This commit is contained in:
		
							parent
							
								
									13973348df
								
							
						
					
					
						commit
						1da7dd3da9
					
				@ -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
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										19
									
								
								modules/sync/status_pool_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								modules/sync/status_pool_test.go
									
									
									
									
									
										Normal file
									
								
							@ -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"))
 | 
			
		||||
}
 | 
			
		||||
@ -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()
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user