1 // Copyright 2013 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
7 // A Pool is a set of temporary objects that may be individually saved
10 // Any item stored in the Pool may be removed automatically by the
11 // implementation at any time without notification.
12 // If the Pool holds the only reference when this happens, the item
13 // might be deallocated.
15 // A Pool is safe for use by multiple goroutines simultaneously.
17 // Pool's intended use is for free lists maintained in global variables,
18 // typically accessed by multiple goroutines simultaneously. Using a
19 // Pool instead of a custom free list allows the runtime to reclaim
20 // entries from the pool when it makes sense to do so. An
21 // appropriate use of sync.Pool is to create a pool of temporary buffers
22 // shared between independent clients of a global resource. On the
23 // other hand, if a free list is maintained as part of an object used
24 // only by a single client and freed when the client completes,
25 // implementing that free list as a Pool is not appropriate.
27 // This is an experimental type and might not be released.
29 next
*Pool
// for use by runtime. must be first.
30 list
[]interface{} // offset known to runtime
31 mu Mutex
// guards list
33 // New optionally specifies a function to generate
34 // a value when Get would otherwise return nil.
35 // It may not be changed concurrently with calls to Get.
36 New
func() interface{}
39 func runtime_registerPool(*Pool
)
41 // Put adds x to the pool.
42 func (p
*Pool
) Put(x
interface{}) {
48 runtime_registerPool(p
)
50 p
.list
= append(p
.list
, x
)
54 // Get selects an arbitrary item from the Pool, removes it from the
55 // Pool, and returns it to the caller.
56 // Get may choose to ignore the pool and treat it as empty.
57 // Callers should not assume any relation between values passed to Put and
58 // the values returned by Get.
60 // If Get would otherwise return nil and p.New is non-nil, Get returns
61 // the result of calling p.New.
62 func (p
*Pool
) Get() interface{} {
65 if n
:= len(p
.list
); n
> 0 {
67 p
.list
[n
-1] = nil // Just to be safe
71 if x
== nil && p
.New
!= nil {