-
Notifications
You must be signed in to change notification settings - Fork 19
/
sessions.go
67 lines (50 loc) · 882 Bytes
/
sessions.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
package cocaine12
import (
"sync"
)
type sessions struct {
sync.RWMutex
links map[uint64]Channel
counter uint64
}
func newSessions() *sessions {
return &sessions{
links: make(map[uint64]Channel),
counter: 1,
}
}
func (s *sessions) Next() uint64 {
s.Lock()
s.counter++
i := s.counter
s.Unlock()
return i
}
func (s *sessions) Attach(session Channel) uint64 {
s.Lock()
s.counter++
s.links[s.counter] = session
current := s.counter
s.Unlock()
return current
}
func (s *sessions) Detach(id uint64) {
s.Lock()
delete(s.links, id)
s.Unlock()
}
func (s *sessions) Get(id uint64) (Channel, bool) {
s.RLock()
session, ok := s.links[id]
s.RUnlock()
return session, ok
}
func (s *sessions) Keys() []uint64 {
s.RLock()
var keys = make([]uint64, 0, len(s.links))
for k := range s.links {
keys = append(keys, k)
}
s.RUnlock()
return keys
}