map.mx raw
1 package sync
2
3 import "internal/task"
4
5 // This file implements just enough of sync.Map to get packages to compile. It
6 // is no more efficient than a map with a lock.
7
8 type Map struct {
9 lock task.PMutex
10 m map[interface{}]interface{}
11 }
12
13 func (m *Map) Delete(key interface{}) {
14 m.lock.Lock()
15 defer m.lock.Unlock()
16 delete(m.m, key)
17 }
18
19 func (m *Map) Load(key interface{}) (value interface{}, ok bool) {
20 m.lock.Lock()
21 defer m.lock.Unlock()
22 value, ok = m.m[key]
23 return
24 }
25
26 func (m *Map) LoadOrStore(key, value interface{}) (actual interface{}, loaded bool) {
27 m.lock.Lock()
28 defer m.lock.Unlock()
29 if m.m == nil {
30 m.m = map[interface{}]interface{}{}
31 }
32 if existing, ok := m.m[key]; ok {
33 return existing, true
34 }
35 m.m[key] = value
36 return value, false
37 }
38
39 func (m *Map) LoadAndDelete(key interface{}) (value interface{}, loaded bool) {
40 m.lock.Lock()
41 defer m.lock.Unlock()
42 value, ok := m.m[key]
43 if !ok {
44 return nil, false
45 }
46 delete(m.m, key)
47 return value, true
48 }
49
50 func (m *Map) Store(key, value interface{}) {
51 m.lock.Lock()
52 defer m.lock.Unlock()
53 if m.m == nil {
54 m.m = map[interface{}]interface{}{}
55 }
56 m.m[key] = value
57 }
58
59 func (m *Map) Range(f func(key, value interface{}) bool) {
60 m.lock.Lock()
61 defer m.lock.Unlock()
62
63 if m.m == nil {
64 return
65 }
66
67 for k, v := range m.m {
68 if !f(k, v) {
69 break
70 }
71 }
72 }
73
74 // Swap replaces the value for the given key, and returns the old value if any.
75 func (m *Map) Swap(key, value any) (previous any, loaded bool) {
76 m.lock.Lock()
77 defer m.lock.Unlock()
78 if m.m == nil {
79 m.m = map[interface{}]interface{}{}
80 }
81 previous, loaded = m.m[key]
82 m.m[key] = value
83 return
84 }
85