mirror of
https://github.com/duanhf2012/origin.git
synced 2026-05-17 22:54:49 +08:00
新增mapex,降低互锁可能
This commit is contained in:
93
util/mapex.go
Normal file
93
util/mapex.go
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
package util
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/duanhf2012/origin/util/hash"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
DEFAULT_MAX_HASH_NUM = 100
|
||||||
|
)
|
||||||
|
|
||||||
|
type MapEx struct {
|
||||||
|
m []Map
|
||||||
|
hashMapNum uint
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewMapEx() *MapEx {
|
||||||
|
mapEx := MapEx{}
|
||||||
|
mapEx.Init(DEFAULT_MAX_HASH_NUM)
|
||||||
|
return &mapEx
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *MapEx) Init(hashMapNum uint) {
|
||||||
|
var i uint
|
||||||
|
for i = 0; i < hashMapNum; i++ {
|
||||||
|
m.m = append(m.m, Map{})
|
||||||
|
}
|
||||||
|
|
||||||
|
m.hashMapNum = hashMapNum
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *MapEx) ClearMap() {
|
||||||
|
var i uint
|
||||||
|
for i = 0; i < m.hashMapNum; i++ {
|
||||||
|
m.m[i].ClearMap()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *MapEx) GetHashCode(key interface{}) uint {
|
||||||
|
return hash.HashNumber(fmt.Sprint(key))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *MapEx) GetMapByKey(key interface{}) *Map {
|
||||||
|
idx := m.GetHashCode(key) % m.hashMapNum
|
||||||
|
if idx < 0 || idx > m.hashMapNum {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return &m.m[idx]
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *MapEx) Get(key interface{}) interface{} {
|
||||||
|
mapData := m.GetMapByKey(key)
|
||||||
|
if mapData == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return mapData.Get(key)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *MapEx) Set(key interface{}, value interface{}) {
|
||||||
|
mapData := m.GetMapByKey(key)
|
||||||
|
if mapData == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
mapData.Set(key, value)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *MapEx) Del(key interface{}) {
|
||||||
|
|
||||||
|
mapData := m.GetMapByKey(key)
|
||||||
|
if mapData == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
mapData.Del(key)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *MapEx) RLockRange(f func(key interface{}, value interface{})) {
|
||||||
|
var i uint
|
||||||
|
for i = 0; i < m.hashMapNum; i++ {
|
||||||
|
m.m[i].RLockRange(f)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *MapEx) LockRange(f func(key interface{}, value interface{})) {
|
||||||
|
var i uint
|
||||||
|
for i = 0; i < m.hashMapNum; i++ {
|
||||||
|
m.m[i].LockRange(f)
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user