diff options
| author | Brian McQueen <bmcquee@l-sclX1Q0DV7-M.local> | 2014-12-14 00:13:51 -0800 |
|---|---|---|
| committer | Brian McQueen <bmcquee@l-sclX1Q0DV7-M.local> | 2014-12-14 00:13:51 -0800 |
| commit | a3583e4e7cdba69346397b963193eda9ed10c3a3 (patch) | |
| tree | 5c984294280a16779c416a90f0f19e28cb98e7f4 /go/util/concurrent_read_map.go | |
| parent | bd664def45925d81dfae9c7edfb244d2367170ca (diff) | |
| parent | e431d4121e8da8d7fc243b29b780c2cd535a4210 (diff) | |
| download | seaweedfs-a3583e4e7cdba69346397b963193eda9ed10c3a3.tar.xz seaweedfs-a3583e4e7cdba69346397b963193eda9ed10c3a3.zip | |
Merge branch 'master' of https://github.com/chrislusf/weed-fs
Diffstat (limited to 'go/util/concurrent_read_map.go')
| -rw-r--r-- | go/util/concurrent_read_map.go | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/go/util/concurrent_read_map.go b/go/util/concurrent_read_map.go new file mode 100644 index 000000000..d16fdbcaf --- /dev/null +++ b/go/util/concurrent_read_map.go @@ -0,0 +1,37 @@ +package util + +import "sync" + +// A mostly for read map, which can thread-safely +// initialize the map entries. +type ConcurrentReadMap struct { + rmutex sync.RWMutex + mutex sync.Mutex + Items map[string]interface{} +} + +func NewConcurrentReadMap() *ConcurrentReadMap { + return &ConcurrentReadMap{Items: make(map[string]interface{})} +} + +func (m *ConcurrentReadMap) initMapEntry(key string, newEntry func() interface{}) (value interface{}) { + m.mutex.Lock() + defer m.mutex.Unlock() + if value, ok := m.Items[key]; ok { + return value + } + value = newEntry() + m.Items[key] = value + return value +} + +func (m *ConcurrentReadMap) Get(key string, newEntry func() interface{}) interface{} { + m.rmutex.RLock() + if value, ok := m.Items[key]; ok { + m.rmutex.RUnlock() + return value + } else { + m.rmutex.RUnlock() + return m.initMapEntry(key, newEntry) + } +} |
