summaryrefslogtreecommitdiff
path: root/vendor/codeberg.org/gruf/go-mutexes/pool.go
blob: 135e2c1175a5441df758f7556f62dfeab2d81fe9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package mutexes

// pool is a very simply memory pool.
type pool struct {
	current []interface{}
	victim  []interface{}
	alloc   func() interface{}
}

// Acquire will returns a sync.RWMutex from pool (or alloc new).
func (p *pool) Acquire() interface{} {
	// First try the current queue
	if l := len(p.current) - 1; l >= 0 {
		v := p.current[l]
		p.current = p.current[:l]
		return v
	}

	// Next try the victim queue.
	if l := len(p.victim) - 1; l >= 0 {
		v := p.victim[l]
		p.victim = p.victim[:l]
		return v
	}

	// Lastly, alloc new.
	return p.alloc()
}

// Release places a sync.RWMutex back in the pool.
func (p *pool) Release(v interface{}) {
	p.current = append(p.current, v)
}

// GC will clear out unused entries from the pool.
func (p *pool) GC() {
	current := p.current
	p.current = nil
	p.victim = current
}