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