forked from gitea/gitea
		
	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
	 Andrew
						Andrew