github.com/whtcorpsinc/MilevaDB-Prod@v0.0.0-20211104133533-f57f4be3b597/soliton/localpool/localpool_norace.go (about)

     1  // Copyright 2020 WHTCORPS INC, Inc.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //     http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // See the License for the specific language governing permissions and
    12  // limitations under the License.
    13  
    14  // +build !race
    15  
    16  package localpool
    17  
    18  // Get gets an object from the pool.
    19  func (p *LocalPool) Get() interface{} {
    20  	pid := procPin()
    21  	slot := p.slots[pid]
    22  	objLen := len(slot.objs)
    23  	var result interface{}
    24  	if objLen > 0 {
    25  		lastIdx := objLen - 1
    26  		result = slot.objs[lastIdx]
    27  		slot.objs[lastIdx] = nil
    28  		slot.objs = slot.objs[:lastIdx]
    29  		slot.getHit++
    30  	} else {
    31  		slot.getMiss++
    32  	}
    33  	procUnpin()
    34  	if result == nil {
    35  		result = p.newFn()
    36  	}
    37  	return result
    38  }
    39  
    40  // Put puts an object back to the pool.
    41  // It returns true if the pool is not full and the obj is successfully put into the pool.
    42  func (p *LocalPool) Put(obj interface{}) bool {
    43  	if p.resetFn != nil {
    44  		p.resetFn(obj)
    45  	}
    46  	var ok bool
    47  	pid := procPin()
    48  	slot := p.slots[pid]
    49  	if len(slot.objs) < p.sizePerProc {
    50  		slot.objs = append(slot.objs, obj)
    51  		slot.putHit++
    52  		ok = true
    53  	} else {
    54  		slot.putMiss++
    55  	}
    56  	procUnpin()
    57  	return ok
    58  }