-
Notifications
You must be signed in to change notification settings - Fork 21
/
clientmap.go
114 lines (89 loc) · 1.87 KB
/
clientmap.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
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
package core
import (
"github.com/MG-RAST/AWE/lib/logger"
)
type ClientMap struct {
RWMutex
_map map[string]*Client
}
func NewClientMap() *ClientMap {
cm := &ClientMap{_map: make(map[string]*Client)}
cm.RWMutex.Init("ClientMap")
return cm
}
func (cl *ClientMap) Add(client *Client, lock bool) (err error) {
if lock {
err = cl.LockNamed("(ClientMap) Add")
if err != nil {
return
}
defer cl.Unlock()
}
_, found := cl._map[client.Id]
if found {
logger.Warning("Client Id % already exists.", client.Id)
}
cl._map[client.Id] = client
return
}
func (cl *ClientMap) Get(client_id string, lock bool) (client *Client, ok bool, err error) {
if lock {
read_lock, xerr := cl.RLockNamed("Get")
if xerr != nil {
err = xerr
return
}
defer cl.RUnlockNamed(read_lock)
}
client, ok = cl._map[client_id]
return
}
func (cl *ClientMap) Has(client_id string, lock bool) (ok bool, err error) {
if lock {
read_lock, xerr := cl.RLockNamed("Has")
if xerr != nil {
err = xerr
return
}
defer cl.RUnlockNamed(read_lock)
}
_, ok = cl._map[client_id]
return
}
func (cl *ClientMap) Delete(client_id string, lock bool) (err error) {
if lock {
err = cl.LockNamed("(ClientMap) Delete")
if err != nil {
return
}
}
delete(cl._map, client_id)
if lock {
cl.Unlock()
logger.Debug(3, "(ClientMap) Delete done\n")
}
return
}
func (cl *ClientMap) GetClientIds() (ids []string, err error) {
read_lock, err := cl.RLockNamed("GetClientIds")
if err != nil {
return
}
defer cl.RUnlockNamed(read_lock)
for id, _ := range cl._map {
ids = append(ids, id)
}
return
}
func (cl *ClientMap) GetClients() (clients []*Client, err error) {
clients = []*Client{}
read_lock, err := cl.RLockNamed("GetClients")
if err != nil {
return
}
defer cl.RUnlockNamed(read_lock)
for _, client := range cl._map {
clients = append(clients, client)
}
return
}