mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-10-30 21:02:26 -05: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
 | |
| }
 |