minio/pkgs/erasure/lru.go
2014-11-24 15:10:25 -08:00

65 lines
1.5 KiB
Go

/*
* Mini Object Storage, (C) 2014 Minio, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package erasure
import (
"github.com/golang/groupcache/lru"
"sync"
)
// thread-safe LRU cache from GroupCache
type Cache struct {
mutex sync.RWMutex
cache *lru.Cache
}
var DefaultCache *Cache = GetCache(0)
// Allocate ``Cache`` LRU
func GetCache(capacity int) *Cache {
return &Cache{
cache: lru.New(capacity),
}
}
// ``GetC()`` -- Grab encoder from LRU
func (c *Cache) GetC(ep *EncoderParams) *Encoder {
if encoder, ret := c._Get(ep); ret {
return encoder
}
encoder := NewEncoder(ep)
c._Put(ep, encoder)
return encoder
}
// ``_Get()`` -- Get key from existing LRU
func (c *Cache) _Get(ep *EncoderParams) (*Encoder, bool) {
c.mutex.RLock()
defer c.mutex.RUnlock()
if encoder, ret := c.cache.Get(ep); ret {
return encoder.(*Encoder), ret
}
return nil, false
}
// ``_Put()`` -- Add key to existing LRU
func (c *Cache) _Put(ep *EncoderParams, encoder *Encoder) {
c.mutex.Lock()
defer c.mutex.Unlock()
c.cache.Add(ep, encoder)
}