-
Notifications
You must be signed in to change notification settings - Fork 46
/
client-pool.go
59 lines (50 loc) · 1.15 KB
/
client-pool.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
package tcpx
import (
"sync"
)
var GlobalClientPool *ClientPool
type ClientPool struct {
Clients map[string]*Context
m *sync.RWMutex
}
func NewClientPool() *ClientPool {
return &ClientPool{
Clients: make(map[string]*Context),
m: &sync.RWMutex{},
}
}
func init() {
GlobalClientPool = NewClientPool()
}
func (cp *ClientPool) SetClientPool(username string, ctx *Context) {
cp.m.Lock()
defer cp.m.Unlock()
cp.Clients[username] = ctx
}
func (cp *ClientPool) GetClientPool(username string) *Context {
cp.m.RLock()
defer cp.m.RUnlock()
return cp.Clients[username]
}
func (cp *ClientPool) DeleteFromClientPool(username string) {
cp.m.Lock()
defer cp.m.Unlock()
delete(cp.Clients, username)
}
func (cp *ClientPool) Online(username string, ctx *Context) {
cp.SetClientPool(username, ctx)
}
func (cp *ClientPool) Offline(username string) {
ctx := cp.GetClientPool(username)
if ctx != nil {
cp.DeleteFromClientPool(username)
}
}
// Whether username found in pool.
// Can't tell whether conn is close or not
func (cp *ClientPool) isOnline(username string) bool {
cp.m.RLock()
defer cp.m.RUnlock()
_, ok := cp.Clients[username]
return ok
}