-
Notifications
You must be signed in to change notification settings - Fork 20
/
Copy pathserver_connections.go
115 lines (111 loc) · 3.02 KB
/
server_connections.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
115
package gologix
import (
"fmt"
"log/slog"
"sync"
"time"
)
type serverConnection struct {
ID uint16
OT uint32
TO uint32
RPI time.Duration
Path []byte
Open bool
}
type serverConnectionManager struct {
Connections []*serverConnection
Lock sync.RWMutex
Logger *slog.Logger
}
func (cm *serverConnectionManager) Init(logger *slog.Logger) {
cm.Connections = make([]*serverConnection, 0, 32)
cm.Logger = logger
}
func (cm *serverConnectionManager) Add(conn *serverConnection) {
cm.Logger.Info("New Managed Connection.", "conn", *conn)
cm.Lock.Lock()
defer cm.Lock.Unlock()
cm.Connections = append(cm.Connections, conn)
}
func (cm *serverConnectionManager) GetByID(ID uint16) (*serverConnection, error) {
cm.Lock.RLock()
defer cm.Lock.RUnlock()
for _, conn := range cm.Connections {
if conn.ID == ID {
return conn, nil
}
}
return nil, fmt.Errorf("couldn't find connection %v by ID", ID)
}
func (cm *serverConnectionManager) GetByOT(OT uint32) (*serverConnection, error) {
cm.Lock.RLock()
defer cm.Lock.RUnlock()
for _, conn := range cm.Connections {
if conn.OT == OT {
return conn, nil
}
}
return nil, fmt.Errorf("couldn't find connection %v by OT", OT)
}
func (cm *serverConnectionManager) GetByTO(TO uint32) (*serverConnection, error) {
cm.Lock.RLock()
defer cm.Lock.RUnlock()
for _, conn := range cm.Connections {
if conn.TO == TO {
return conn, nil
}
}
return nil, fmt.Errorf("couldn't find connection %v by TO", TO)
}
func (cm *serverConnectionManager) CloseByID(ID uint16) error {
cm.Lock.Lock()
defer cm.Lock.Unlock()
for i, conn := range cm.Connections {
if conn.ID == ID {
conn.Open = false
if len(cm.Connections) == 1 {
cm.Connections = make([]*serverConnection, 0, 32)
return nil
}
cm.Connections[i] = cm.Connections[len(cm.Connections)-1]
cm.Connections = cm.Connections[:len(cm.Connections)-1]
return nil
}
}
return fmt.Errorf("couldn't find connection %v by ID", ID)
}
func (cm *serverConnectionManager) CloseByOT(OT uint32) error {
cm.Lock.Lock()
defer cm.Lock.Unlock()
for i, conn := range cm.Connections {
if conn.OT == OT {
conn.Open = false
if len(cm.Connections) == 1 {
cm.Connections = make([]*serverConnection, 0, 32)
return nil
}
cm.Connections[i] = cm.Connections[len(cm.Connections)-1]
cm.Connections = cm.Connections[:len(cm.Connections)-1]
return nil
}
}
return fmt.Errorf("couldn't find connection %v by OT", OT)
}
func (cm *serverConnectionManager) CloseByTO(TO uint32) error {
cm.Lock.Lock()
defer cm.Lock.Unlock()
for i, conn := range cm.Connections {
if conn.TO == TO {
conn.Open = false
if len(cm.Connections) == 1 {
cm.Connections = make([]*serverConnection, 0, 32)
return nil
}
cm.Connections[i] = cm.Connections[len(cm.Connections)-1]
cm.Connections = cm.Connections[:len(cm.Connections)-1]
return nil
}
}
return fmt.Errorf("couldn't find connection %v by TO", TO)
}