mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-11-03 22:32:25 -06:00 
			
		
		
		
	* update go-store to v2.0.6: closer callbacks are now only ever called at most once Signed-off-by: kim <grufwub@gmail.com> * bump go-store => v2.0.7, go-mutexes => v1.1.4 Signed-off-by: kim <grufwub@gmail.com> Signed-off-by: kim <grufwub@gmail.com>
		
			
				
	
	
		
			39 lines
		
	
	
	
		
			784 B
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			39 lines
		
	
	
	
		
			784 B
		
	
	
	
		
			Go
		
	
	
	
	
	
package mutexes
 | 
						|
 | 
						|
// pool is a very simply memory pool.
 | 
						|
type pool struct {
 | 
						|
	current []*rwmutex
 | 
						|
	victim  []*rwmutex
 | 
						|
}
 | 
						|
 | 
						|
// Acquire will returns a rwmutex from pool (or alloc new).
 | 
						|
func (p *pool) Acquire() *rwmutex {
 | 
						|
	// First try the current queue
 | 
						|
	if l := len(p.current) - 1; l >= 0 {
 | 
						|
		mu := p.current[l]
 | 
						|
		p.current = p.current[:l]
 | 
						|
		return mu
 | 
						|
	}
 | 
						|
 | 
						|
	// Next try the victim queue.
 | 
						|
	if l := len(p.victim) - 1; l >= 0 {
 | 
						|
		mu := p.victim[l]
 | 
						|
		p.victim = p.victim[:l]
 | 
						|
		return mu
 | 
						|
	}
 | 
						|
 | 
						|
	// Lastly, alloc new.
 | 
						|
	return &rwmutex{}
 | 
						|
}
 | 
						|
 | 
						|
// Release places a sync.RWMutex back in the pool.
 | 
						|
func (p *pool) Release(mu *rwmutex) {
 | 
						|
	p.current = append(p.current, mu)
 | 
						|
}
 | 
						|
 | 
						|
// GC will clear out unused entries from the pool.
 | 
						|
func (p *pool) GC() {
 | 
						|
	current := p.current
 | 
						|
	p.current = nil
 | 
						|
	p.victim = current
 | 
						|
}
 |