aboutsummaryrefslogtreecommitdiff
path: root/go/util/concurrent_read_map.go
diff options
context:
space:
mode:
authorBrian McQueen <bmcquee@l-sclX1Q0DV7-M.local>2014-12-14 00:13:51 -0800
committerBrian McQueen <bmcquee@l-sclX1Q0DV7-M.local>2014-12-14 00:13:51 -0800
commita3583e4e7cdba69346397b963193eda9ed10c3a3 (patch)
tree5c984294280a16779c416a90f0f19e28cb98e7f4 /go/util/concurrent_read_map.go
parentbd664def45925d81dfae9c7edfb244d2367170ca (diff)
parente431d4121e8da8d7fc243b29b780c2cd535a4210 (diff)
downloadseaweedfs-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.go37
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)
+ }
+}