From 6f21a83ec63547f0978d3414008b8e872a803a9a Mon Sep 17 00:00:00 2001 From: lifeiyi <736926938@qq.com> Date: Sat, 28 Mar 2020 17:52:35 +0800 Subject: [PATCH] =?UTF-8?q?mapex=E4=B8=8D=E6=AD=A3=E7=A1=AE=E7=BA=A0?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- util/has/hash.go | 1 - util/umap/mapEx.go | 29 +++++++++++++++++++++++++---- 2 files changed, 25 insertions(+), 5 deletions(-) delete mode 100644 util/has/hash.go diff --git a/util/has/hash.go b/util/has/hash.go deleted file mode 100644 index 1ff3915..0000000 --- a/util/has/hash.go +++ /dev/null @@ -1 +0,0 @@ -package has diff --git a/util/umap/mapEx.go b/util/umap/mapEx.go index 6dc6dc7..abfe0f5 100644 --- a/util/umap/mapEx.go +++ b/util/umap/mapEx.go @@ -2,8 +2,9 @@ package umap import ( "fmt" - "github.com/duanhf2012/originnet/util/hash" + "github.com/duanhf2012/origin/util/hash" "sync" + "sync/atomic" ) const ( @@ -15,6 +16,7 @@ type MapEx struct { m []map[interface{}]interface{} l []sync.RWMutex hashMapNum int + rangeIdx uint32 } func (m *MapEx) Init(hashMapNum int) { @@ -35,6 +37,19 @@ func NewMapEx() *MapEx { return &mapEx } + +func (m *MapEx) NextRLockRange(f func(key interface{}, value interface{})) { + i := atomic.AddUint32(&m.rangeIdx,1)%uint32(m.hashMapNum) + + m.l[i].RLock() + for key, val := range m.m[i] { + f(key, val) + } + + m.l[i].RUnlock() +} + + func (m *MapEx) ClearMap() { for i := 0; i < DEFAULT_SAFE_MAP_MAX_HASH_NUM; i++ { m.l[i].Lock() @@ -196,10 +211,16 @@ func (m *MapEx) LockSet(key interface{}, f func(value interface{}) interface{}) ret, ok := val[key] if ok == false { - val[key] = f(nil) + ret := f(nil) + if ret != nil { + val[key] =ret + } } else { - val[key] = f(ret) + ret := f(ret) + if ret != nil { + val[key] =ret + } } m.l[idx].Unlock() -} +} \ No newline at end of file