Skip to content

Commit fce0ebb

Browse files
committed
feature: Shutting down gracefully
1 parent 4932097 commit fce0ebb

File tree

5 files changed

+40
-6
lines changed

5 files changed

+40
-6
lines changed

cmd/ssl-game-controller/main.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ import (
77
"github.com/gobuffalo/packr"
88
"log"
99
"net/http"
10+
"os"
11+
"os/signal"
12+
"syscall"
1013
)
1114

1215
var address = flag.String("address", "localhost:8081", "The address on which the UI and API is served")
@@ -43,6 +46,15 @@ func setupGameController() {
4346

4447
gameController := gc.NewGameController(cfg)
4548
gameController.Start()
49+
50+
sigs := make(chan os.Signal, 1)
51+
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
52+
go func() {
53+
<-sigs
54+
gameController.Stop()
55+
os.Exit(0)
56+
}()
57+
4658
// serve the bidirectional web socket
4759
http.HandleFunc("/api/control", gameController.ApiServer().WsHandler)
4860
}

internal/app/ci/ci.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ type Server struct {
2121
tickChan chan time.Time
2222
mutex sync.Mutex
2323
gcEngine *engine.Engine
24+
running bool
2425
}
2526

2627
func NewServer(address string) *Server {
@@ -32,13 +33,16 @@ func (s *Server) SetEngine(engine *engine.Engine) {
3233
}
3334

3435
func (s *Server) Start() {
36+
s.running = true
3537
go s.listen(s.address)
3638
}
3739

3840
func (s *Server) Stop() {
41+
s.running = false
3942
if err := s.listener.Close(); err != nil {
4043
log.Printf("Could not close listener: %v", err)
4144
}
45+
s.listener = nil
4246
}
4347

4448
func (s *Server) listen(address string) {
@@ -50,7 +54,7 @@ func (s *Server) listen(address string) {
5054
log.Print("Listening on ", address)
5155
s.listener = listener
5256

53-
for {
57+
for s.running {
5458
conn, err := listener.Accept()
5559
if err != nil {
5660
log.Print("Could not accept connection: ", err)

internal/app/gc/gc.go

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,12 +92,21 @@ func (c *GameController) Start() {
9292

9393
// Stop stops all go routines
9494
func (c *GameController) Stop() {
95-
// Note: Stopping is not (yet) implemented correctly by all servers.
95+
96+
switch c.config.TimeAcquisitionMode {
97+
case config.TimeAcquisitionModeSystem:
98+
c.visionReceiver.Stop()
99+
c.trackerReceiver.Stop()
100+
break
101+
case config.TimeAcquisitionModeVision:
102+
c.visionReceiver.Stop()
103+
c.trackerReceiver.Stop()
104+
case config.TimeAcquisitionModeCi:
105+
c.ciServer.Stop()
106+
}
107+
96108
c.gcEngine.UnregisterHook("messageGen")
97109
c.messageGenerator.Stop()
98-
c.ciServer.Stop()
99-
c.trackerReceiver.Stop()
100-
c.visionReceiver.Stop()
101110
c.autoRefServer.Server.Stop()
102111
c.autoRefServerTls.Server.Stop()
103112
c.teamServer.Server.Stop()

internal/app/publish/messagegenerator.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ func NewMessageGenerator() (m *MessageGenerator) {
2525
m.goal = map[state.Team]bool{}
2626
m.goal[state.Team_BLUE] = false
2727
m.goal[state.Team_YELLOW] = false
28+
m.quit = make(chan int, 1)
2829

2930
return
3031
}

internal/app/rcon/server.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ type Server struct {
2424
trustedKeys map[string]*rsa.PublicKey
2525
connectionHandler func(net.Conn)
2626
listener net.Listener
27+
running bool
2728
}
2829

2930
type Client struct {
@@ -49,31 +50,38 @@ func NewServer(address string) (s *Server) {
4950

5051
func (s *Server) Start() {
5152
var err error
53+
s.running = true
5254
if s.Tls {
5355
s.listener, err = s.createTlsListener()
5456
} else {
5557
s.listener, err = s.createListener()
5658
}
5759
if err != nil {
60+
s.running = false
5861
log.Printf("Failed to listen on %v: %v", s.address, err)
5962
return
6063
}
6164
go s.listen()
6265
}
6366

6467
func (s *Server) Stop() {
68+
if s.listener == nil {
69+
return
70+
}
71+
s.running = false
6572
if err := s.listener.Close(); err != nil {
6673
log.Printf("Could not close listener: %v", err)
6774
}
6875
for id := range s.clients {
6976
s.CloseConnection(id)
7077
}
78+
s.listener = nil
7179
}
7280

7381
func (s *Server) listen() {
7482
log.Print("Listening on ", s.address)
7583

76-
for {
84+
for s.running {
7785
conn, err := s.listener.Accept()
7886
if err != nil {
7987
log.Print("Could not accept connection: ", err)

0 commit comments

Comments
 (0)