File tree Expand file tree Collapse file tree 5 files changed +40
-6
lines changed Expand file tree Collapse file tree 5 files changed +40
-6
lines changed Original file line number Diff line number Diff line change 7
7
"github.com/gobuffalo/packr"
8
8
"log"
9
9
"net/http"
10
+ "os"
11
+ "os/signal"
12
+ "syscall"
10
13
)
11
14
12
15
var address = flag .String ("address" , "localhost:8081" , "The address on which the UI and API is served" )
@@ -43,6 +46,15 @@ func setupGameController() {
43
46
44
47
gameController := gc .NewGameController (cfg )
45
48
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
+
46
58
// serve the bidirectional web socket
47
59
http .HandleFunc ("/api/control" , gameController .ApiServer ().WsHandler )
48
60
}
Original file line number Diff line number Diff line change @@ -21,6 +21,7 @@ type Server struct {
21
21
tickChan chan time.Time
22
22
mutex sync.Mutex
23
23
gcEngine * engine.Engine
24
+ running bool
24
25
}
25
26
26
27
func NewServer (address string ) * Server {
@@ -32,13 +33,16 @@ func (s *Server) SetEngine(engine *engine.Engine) {
32
33
}
33
34
34
35
func (s * Server ) Start () {
36
+ s .running = true
35
37
go s .listen (s .address )
36
38
}
37
39
38
40
func (s * Server ) Stop () {
41
+ s .running = false
39
42
if err := s .listener .Close (); err != nil {
40
43
log .Printf ("Could not close listener: %v" , err )
41
44
}
45
+ s .listener = nil
42
46
}
43
47
44
48
func (s * Server ) listen (address string ) {
@@ -50,7 +54,7 @@ func (s *Server) listen(address string) {
50
54
log .Print ("Listening on " , address )
51
55
s .listener = listener
52
56
53
- for {
57
+ for s . running {
54
58
conn , err := listener .Accept ()
55
59
if err != nil {
56
60
log .Print ("Could not accept connection: " , err )
Original file line number Diff line number Diff line change @@ -92,12 +92,21 @@ func (c *GameController) Start() {
92
92
93
93
// Stop stops all go routines
94
94
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
+
96
108
c .gcEngine .UnregisterHook ("messageGen" )
97
109
c .messageGenerator .Stop ()
98
- c .ciServer .Stop ()
99
- c .trackerReceiver .Stop ()
100
- c .visionReceiver .Stop ()
101
110
c .autoRefServer .Server .Stop ()
102
111
c .autoRefServerTls .Server .Stop ()
103
112
c .teamServer .Server .Stop ()
Original file line number Diff line number Diff line change @@ -25,6 +25,7 @@ func NewMessageGenerator() (m *MessageGenerator) {
25
25
m .goal = map [state.Team ]bool {}
26
26
m .goal [state .Team_BLUE ] = false
27
27
m .goal [state .Team_YELLOW ] = false
28
+ m .quit = make (chan int , 1 )
28
29
29
30
return
30
31
}
Original file line number Diff line number Diff line change @@ -24,6 +24,7 @@ type Server struct {
24
24
trustedKeys map [string ]* rsa.PublicKey
25
25
connectionHandler func (net.Conn )
26
26
listener net.Listener
27
+ running bool
27
28
}
28
29
29
30
type Client struct {
@@ -49,31 +50,38 @@ func NewServer(address string) (s *Server) {
49
50
50
51
func (s * Server ) Start () {
51
52
var err error
53
+ s .running = true
52
54
if s .Tls {
53
55
s .listener , err = s .createTlsListener ()
54
56
} else {
55
57
s .listener , err = s .createListener ()
56
58
}
57
59
if err != nil {
60
+ s .running = false
58
61
log .Printf ("Failed to listen on %v: %v" , s .address , err )
59
62
return
60
63
}
61
64
go s .listen ()
62
65
}
63
66
64
67
func (s * Server ) Stop () {
68
+ if s .listener == nil {
69
+ return
70
+ }
71
+ s .running = false
65
72
if err := s .listener .Close (); err != nil {
66
73
log .Printf ("Could not close listener: %v" , err )
67
74
}
68
75
for id := range s .clients {
69
76
s .CloseConnection (id )
70
77
}
78
+ s .listener = nil
71
79
}
72
80
73
81
func (s * Server ) listen () {
74
82
log .Print ("Listening on " , s .address )
75
83
76
- for {
84
+ for s . running {
77
85
conn , err := s .listener .Accept ()
78
86
if err != nil {
79
87
log .Print ("Could not accept connection: " , err )
You can’t perform that action at this time.
0 commit comments