summaryrefslogtreecommitdiffhomepage
path: root/syncs/pool.go
blob: 9a13dd526f55dedc35b75e280ddb1d10a7c9ba04 (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
// Copyright (c) Tailscale Inc & contributors
// SPDX-License-Identifier: BSD-3-Clause

package syncs

import "sync"

// Pool is the generic version of [sync.Pool].
type Pool[T any] struct {
	pool sync.Pool

	// New optionally specifies a function to generate
	// a value when Get would otherwise return the zero value of T.
	// It may not be changed concurrently with calls to Get.
	New func() T
}

// Get selects an arbitrary item from the Pool, removes it from the Pool,
// and returns it to the caller. See [sync.Pool.Get].
func (p *Pool[T]) Get() T {
	x, ok := p.pool.Get().(T)
	if !ok && p.New != nil {
		x = p.New()
	}
	return x
}

// Put adds x to the pool.
func (p *Pool[T]) Put(x T) {
	p.pool.Put(x)
}