@@ -44,33 +44,41 @@ func (cs *Clients) New(ctx context.Context, w http.ResponseWriter, clientID stri
44
44
}
45
45
46
46
cs .locker .Lock ()
47
+ defer cs .locker .Unlock ()
48
+
47
49
cs .clients [clientID ] = cli
48
- count := len (cs .clients )
49
- cs .locker .Unlock ()
50
50
51
- return cli , count
51
+ return cli , len ( cs . clients )
52
52
}
53
53
54
54
func (cs * Clients ) Range (f func (cli * Client )) {
55
55
cs .locker .Lock ()
56
+ copied := make ([]* Client , 0 , len (cs .clients ))
56
57
for clientID := range cs .clients {
57
- f ( cs .clients [clientID ])
58
+ copied = append ( copied , cs .clients [clientID ])
58
59
}
59
60
cs .locker .Unlock ()
61
+
62
+ for i := range copied {
63
+ f (copied [i ])
64
+ }
60
65
}
61
66
62
67
func (cs * Clients ) Remove (clientID string ) int {
63
68
cs .locker .Lock ()
69
+ defer cs .locker .Unlock ()
70
+
64
71
delete (cs .clients , clientID )
65
72
count := len (cs .clients )
66
- cs . locker . Unlock ()
73
+
67
74
return count
68
75
}
69
76
70
77
func (cs * Clients ) Active () int {
71
78
cs .locker .Lock ()
79
+ defer cs .locker .Unlock ()
80
+
72
81
count := len (cs .clients )
73
- cs .locker .Unlock ()
74
82
return count
75
83
76
84
}
@@ -80,20 +88,22 @@ func (cs *Clients) Active() int {
80
88
func (cs * Clients ) Clients () []* Client {
81
89
idx := 0
82
90
cs .locker .Lock ()
91
+ defer cs .locker .Unlock ()
92
+
83
93
list := make ([]* Client , len (cs .clients ))
84
94
for clientID := range cs .clients {
85
95
cli := cs .clients [clientID ]
86
96
list [idx ] = cli
87
97
idx ++
88
98
}
89
- cs . locker . Unlock ()
99
+
90
100
return list
91
101
}
92
102
93
103
func (cs * Clients ) Client (clientID string ) * Client {
94
104
cs .locker .Lock ()
105
+ defer cs .locker .Unlock ()
95
106
cli := cs .clients [clientID ]
96
- cs .locker .Unlock ()
97
107
98
108
return cli
99
109
}
0 commit comments