Skip to content

Commit 8fd5a46

Browse files
Merge pull request #7 from fabricekabongo/codex/trouver-et-corriger-un-bug
Fix Server.Stop double close bug
2 parents 2a49b6c + 1827a57 commit 8fd5a46

2 files changed

Lines changed: 21 additions & 2 deletions

File tree

server/server.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@ package server
33
import (
44
"net"
55
"strconv"
6+
"sync"
67
)
78

89
type Server struct {
910
listeners []*Listener
1011
closeChannel chan int
12+
stopOnce sync.Once
1113
}
1214

1315
type ConnectionType string
@@ -32,12 +34,14 @@ func NewServer(listeners []*Listener) *Server {
3234
return &Server{
3335
listeners: listeners,
3436
closeChannel: make(chan int),
37+
stopOnce: sync.Once{},
3538
}
3639
}
3740

3841
func (s *Server) Stop() {
39-
s.closeChannel <- 0
40-
close(s.closeChannel)
42+
s.stopOnce.Do(func() {
43+
close(s.closeChannel)
44+
})
4145
}
4246

4347
func (s *Server) Start() {

server/server_test.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package server
2+
3+
import "testing"
4+
5+
func TestServerStopIdempotent(t *testing.T) {
6+
s := NewServer([]*Listener{})
7+
// call Stop multiple times; should not panic
8+
s.Stop()
9+
defer func() {
10+
if r := recover(); r != nil {
11+
t.Fatalf("Stop panicked on second call: %v", r)
12+
}
13+
}()
14+
s.Stop()
15+
}

0 commit comments

Comments
 (0)