github.com/hanwen/go-fuse@v1.0.0/splice/pool.go (about)

     1  // Copyright 2016 the Go-FUSE 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.
     4  
     5  package splice
     6  
     7  import (
     8  	"sync"
     9  )
    10  
    11  var splicePool *pairPool
    12  
    13  type pairPool struct {
    14  	sync.Mutex
    15  	unused    []*Pair
    16  	usedCount int
    17  }
    18  
    19  func ClearSplicePool() {
    20  	splicePool.clear()
    21  }
    22  
    23  func Get() (*Pair, error) {
    24  	return splicePool.get()
    25  }
    26  
    27  func Total() int {
    28  	return splicePool.total()
    29  }
    30  
    31  func Used() int {
    32  	return splicePool.used()
    33  }
    34  
    35  // Done returns the pipe pair to pool.
    36  func Done(p *Pair) {
    37  	splicePool.done(p)
    38  }
    39  
    40  // Closes and discards pipe pair.
    41  func Drop(p *Pair) {
    42  	splicePool.drop(p)
    43  }
    44  
    45  func newSplicePairPool() *pairPool {
    46  	return &pairPool{}
    47  }
    48  
    49  func (pp *pairPool) clear() {
    50  	pp.Lock()
    51  	for _, p := range pp.unused {
    52  		p.Close()
    53  	}
    54  	pp.unused = pp.unused[:0]
    55  	pp.Unlock()
    56  }
    57  
    58  func (pp *pairPool) used() (n int) {
    59  	pp.Lock()
    60  	n = pp.usedCount
    61  	pp.Unlock()
    62  
    63  	return n
    64  }
    65  
    66  func (pp *pairPool) total() int {
    67  	pp.Lock()
    68  	n := pp.usedCount + len(pp.unused)
    69  	pp.Unlock()
    70  	return n
    71  }
    72  
    73  func (pp *pairPool) drop(p *Pair) {
    74  	p.Close()
    75  	pp.Lock()
    76  	pp.usedCount--
    77  	pp.Unlock()
    78  }
    79  
    80  func (pp *pairPool) get() (p *Pair, err error) {
    81  	pp.Lock()
    82  	defer pp.Unlock()
    83  
    84  	pp.usedCount++
    85  	l := len(pp.unused)
    86  	if l > 0 {
    87  		p := pp.unused[l-1]
    88  		pp.unused = pp.unused[:l-1]
    89  		return p, nil
    90  	}
    91  
    92  	return newSplicePair()
    93  }
    94  
    95  func (pp *pairPool) done(p *Pair) {
    96  	p.discard()
    97  
    98  	pp.Lock()
    99  	pp.usedCount--
   100  	pp.unused = append(pp.unused, p)
   101  	pp.Unlock()
   102  }
   103  
   104  func init() {
   105  	splicePool = newSplicePairPool()
   106  }