/
segment.go
54 lines (44 loc) · 988 Bytes
/
segment.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package timeboundmap
import (
"sync"
)
type segment struct {
sync.RWMutex
bucket map[interface{}]*extValue
}
func (s *segment) set(key interface{}, value *extValue) {
s.Lock()
s.bucket[key] = value
s.Unlock()
}
func (s *segment) unsafeSet(key interface{}, value *extValue) {
s.bucket[key] = value
}
func (s *segment) get(key interface{}) (extVal *extValue, ok bool) {
s.RLock()
extVal, ok = s.bucket[key]
s.RUnlock()
return
}
func (s *segment) unsafeGet(key interface{}) (extVal *extValue, ok bool) {
extVal, ok = s.bucket[key]
return
}
func (s *segment) remove(key interface{}, value *extValue) {
if value.cb != nil {
go func(cb CallbackFunc, k, v interface{}) {
cb(k, v)
}(value.cb, key, value.val)
}
s.Lock()
delete(s.bucket, key)
s.Unlock()
}
func (s *segment) unsafeRemove(key interface{}, value *extValue) {
if value.cb != nil {
go func(cb CallbackFunc, k, v interface{}) {
cb(k, v)
}(value.cb, key, value.val)
}
delete(s.bucket, key)
}