File tree Expand file tree Collapse file tree 2 files changed +44
-1
lines changed Expand file tree Collapse file tree 2 files changed +44
-1
lines changed Original file line number Diff line number Diff line change 7
7
"net"
8
8
"regexp"
9
9
"strings"
10
+ "sync"
10
11
"time"
11
12
)
12
13
@@ -57,6 +58,7 @@ type Client struct {
57
58
notify chan Notification
58
59
disconnect chan struct {}
59
60
res []string
61
+ mutex sync.Mutex
60
62
61
63
Server * ServerMethods
62
64
}
@@ -234,7 +236,15 @@ func (c *Client) ExecCmd(cmd *Cmd) ([]string, error) {
234
236
return nil , ErrNotConnected
235
237
}
236
238
237
- c .work <- cmd .String ()
239
+ c .mutex .Lock ()
240
+ defer c .mutex .Unlock ()
241
+
242
+ select {
243
+ case c .work <- cmd .String ():
244
+ // continue
245
+ case <- time .After (c .timeout ):
246
+ return nil , ErrTimeout
247
+ }
238
248
239
249
select {
240
250
case err := <- c .err :
Original file line number Diff line number Diff line change @@ -230,3 +230,36 @@ func TestClientBadHeader(t *testing.T) {
230
230
// Should never get here
231
231
assert .NoError (t , c .Close ())
232
232
}
233
+
234
+ func TestConcurrency (t * testing.T ) {
235
+ s := newServer (t )
236
+ if s == nil {
237
+ return
238
+ }
239
+ defer func () {
240
+ assert .NoError (t , s .Close ())
241
+ }()
242
+
243
+ c , err := NewClient (s .Addr , Timeout (time .Millisecond * 100 ))
244
+ if ! assert .NoError (t , err ) {
245
+ return
246
+ }
247
+
248
+ wait := make (chan struct {})
249
+
250
+ go func () {
251
+ for i := 0 ; i <= 10 ; i ++ {
252
+ _ , err = c .Server .GroupList ()
253
+ assert .NoError (t , err )
254
+ }
255
+ wait <- struct {}{}
256
+ }()
257
+
258
+ for i := 0 ; i <= 10 ; i ++ {
259
+ _ , err = c .Server .GroupList ()
260
+ assert .NoError (t , err )
261
+ }
262
+
263
+ // wait for go routine to finish
264
+ <- wait
265
+ }
You can’t perform that action at this time.
0 commit comments