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 }