forked from dollarkillerx/async_utils
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlockmap.go
More file actions
86 lines (69 loc) · 1.23 KB
/
lockmap.go
File metadata and controls
86 lines (69 loc) · 1.23 KB
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
package async_utils
import (
"fmt"
"sync"
)
type LockMap struct {
mu map[string]*sync.Mutex
}
func NewLockMap() *LockMap {
return &LockMap{
mu: map[string]*sync.Mutex{},
}
}
type RWLockMap struct {
mu map[string]*sync.RWMutex
}
func NewRWLockMap() *RWLockMap {
return &RWLockMap{
mu: map[string]*sync.RWMutex{},
}
}
func (l *LockMap) Lock(key string) {
mutex, ex := l.mu[key]
if !ex {
l.mu[key] = &sync.Mutex{}
mutex = l.mu[key]
}
mutex.Lock()
}
func (l *LockMap) UnLock(key string) error {
mutex, ex := l.mu[key]
if !ex {
return fmt.Errorf("Unlock of unlocked Mutex")
}
mutex.Unlock()
return nil
}
func (l *RWLockMap) Lock(key string) {
mutex, ex := l.mu[key]
if !ex {
l.mu[key] = &sync.RWMutex{}
mutex = l.mu[key]
}
mutex.Lock()
}
func (l *RWLockMap) UnLock(key string) error {
mutex, ex := l.mu[key]
if !ex {
return fmt.Errorf("Unlock of unlocked RWMutex")
}
mutex.Unlock()
return nil
}
func (l *RWLockMap) RLock(key string) {
mutex, ex := l.mu[key]
if !ex {
l.mu[key] = &sync.RWMutex{}
mutex = l.mu[key]
}
mutex.RLock()
}
func (l *RWLockMap) RUnlock(key string) error {
mutex, ex := l.mu[key]
if !ex {
return fmt.Errorf("Unlock of unlocked RWMutex")
}
mutex.RUnlock()
return nil
}