Skip to content

Commit df5388d

Browse files
committed
sim: refactor into 'server' and 'sim' packages.
Hopefully no functional changes, though a bunch of direct accesses to the SimManager controllerTokenToSim map now go through the ControllerTokenToSim method, which grabs the mutex first. This may be the cause of some prior mysterious crashes in e.g. Dispatcher TogglePause() (and hopefully will not introduce deadlocks due to the mutex already held by callers, though that shouldn't be an issue for the dispatcher.
1 parent 9d08cbd commit df5388d

24 files changed

+786
-742
lines changed

config.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919
"github.com/mmp/vice/pkg/panes/stars"
2020
"github.com/mmp/vice/pkg/platform"
2121
"github.com/mmp/vice/pkg/renderer"
22+
"github.com/mmp/vice/pkg/server"
2223
"github.com/mmp/vice/pkg/sim"
2324
"github.com/mmp/vice/pkg/util"
2425

@@ -124,7 +125,7 @@ func (c *Config) Save(lg *log.Logger) error {
124125
}
125126

126127
func (gc *Config) SaveIfChanged(renderer renderer.Renderer, platform platform.Platform,
127-
c *sim.ControlClient, saveSim bool, lg *log.Logger) bool {
128+
c *server.ControlClient, saveSim bool, lg *log.Logger) bool {
128129
gc.Sim = nil
129130
gc.PrimaryTCP = ""
130131
if saveSim {

launch.go

+12-11
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424
"github.com/mmp/vice/pkg/platform"
2525
"github.com/mmp/vice/pkg/rand"
2626
"github.com/mmp/vice/pkg/renderer"
27+
"github.com/mmp/vice/pkg/server"
2728
"github.com/mmp/vice/pkg/sim"
2829
"github.com/mmp/vice/pkg/util"
2930

@@ -42,14 +43,14 @@ type NewSimConfiguration struct {
4243
lastRemoteSimsUpdate time.Time
4344
updateRemoteSimsCall *util.PendingCall
4445

45-
mgr *sim.ConnectionManager
46-
selectedServer *sim.Server
46+
mgr *server.ConnectionManager
47+
selectedServer *server.Server
4748
defaultTRACON *string
4849
tfrCache *av.TFRCache
4950
lg *log.Logger
5051
}
5152

52-
func MakeNewSimConfiguration(mgr *sim.ConnectionManager, defaultTRACON *string, tfrCache *av.TFRCache, lg *log.Logger) *NewSimConfiguration {
53+
func MakeNewSimConfiguration(mgr *server.ConnectionManager, defaultTRACON *string, tfrCache *av.TFRCache, lg *log.Logger) *NewSimConfiguration {
5354
c := &NewSimConfiguration{
5455
lg: lg,
5556
mgr: mgr,
@@ -68,7 +69,7 @@ func (c *NewSimConfiguration) updateRemoteSims() {
6869
// FIXME: this should live in a method in pkg/sim
6970
if time.Since(c.lastRemoteSimsUpdate) > 2*time.Second && c.mgr.RemoteServer != nil {
7071
c.lastRemoteSimsUpdate = time.Now()
71-
var rs map[string]*sim.RemoteSim
72+
var rs map[string]*server.RemoteSim
7273
c.updateRemoteSimsCall = &util.PendingCall{
7374
Call: c.mgr.RemoteServer.Go("SimManager.GetRunningSims", 0, &rs, nil),
7475
IssueTime: time.Now(),
@@ -144,7 +145,7 @@ func (c *NewSimConfiguration) DrawUI(p platform.Platform) bool {
144145

145146
if c.DisplayError != nil {
146147
imgui.PushStyleColor(imgui.StyleColorText, imgui.Vec4{1, .5, .5, 1})
147-
if errors.Is(c.DisplayError, sim.ErrRPCTimeout) || util.IsRPCServerError(c.DisplayError) {
148+
if errors.Is(c.DisplayError, server.ErrRPCTimeout) || util.IsRPCServerError(c.DisplayError) {
148149
imgui.Text("Unable to reach vice server")
149150
} else {
150151
imgui.Text(c.DisplayError.Error())
@@ -591,11 +592,11 @@ func (c *NewSimConfiguration) Start() error {
591592
c.TFRs = c.tfrCache.TFRsForTRACON(c.TRACONName, c.lg)
592593

593594
// FIXME: if we're RPCing with a string method name this code should live in pkg/sim
594-
var result sim.NewSimResult
595+
var result server.NewSimResult
595596
if err := c.selectedServer.CallWithTimeout("SimManager.New", c.NewSimConfiguration, &result); err != nil {
596-
err = sim.TryDecodeError(err)
597+
err = server.TryDecodeError(err)
597598

598-
if err == sim.ErrRPCTimeout || err == sim.ErrRPCVersionMismatch || errors.Is(err, rpc.ErrShutdown) {
599+
if err == server.ErrRPCTimeout || err == server.ErrRPCVersionMismatch || errors.Is(err, rpc.ErrShutdown) {
599600
// Problem with the connection to the remote server? Let the main
600601
// loop try to reconnect.
601602
c.mgr.RemoteServer = nil
@@ -868,7 +869,7 @@ func drawOverflightUI(lc *sim.LaunchConfig, p platform.Platform) (changed bool)
868869
///////////////////////////////////////////////////////////////////////////
869870

870871
type LaunchControlWindow struct {
871-
controlClient *sim.ControlClient
872+
controlClient *server.ControlClient
872873
departures []*LaunchDeparture
873874
arrivalsOverflights []*LaunchArrivalOverflight
874875
lg *log.Logger
@@ -905,7 +906,7 @@ func (la *LaunchArrivalOverflight) Reset() {
905906
la.TotalLaunches = 0
906907
}
907908

908-
func MakeLaunchControlWindow(controlClient *sim.ControlClient, lg *log.Logger) *LaunchControlWindow {
909+
func MakeLaunchControlWindow(controlClient *server.ControlClient, lg *log.Logger) *LaunchControlWindow {
909910
lc := &LaunchControlWindow{controlClient: controlClient}
910911

911912
config := &controlClient.LaunchConfig
@@ -1329,7 +1330,7 @@ func (lc *LaunchControlWindow) Draw(eventStream *sim.EventStream, p platform.Pla
13291330
}
13301331
}
13311332

1332-
func drawScenarioInfoWindow(config *Config, c *sim.ControlClient, p platform.Platform, lg *log.Logger) bool {
1333+
func drawScenarioInfoWindow(config *Config, c *server.ControlClient, p platform.Platform, lg *log.Logger) bool {
13331334
// Ensure that the window is wide enough to show the description
13341335
sz := imgui.CalcTextSize(c.State.SimDescription, false, 0)
13351336
imgui.SetNextWindowSizeConstraints(imgui.Vec2{sz.X + 50, 0}, imgui.Vec2{100000, 100000})

main.go

+15-14
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
"github.com/mmp/vice/pkg/platform"
2727
"github.com/mmp/vice/pkg/rand"
2828
"github.com/mmp/vice/pkg/renderer"
29+
"github.com/mmp/vice/pkg/server"
2930
"github.com/mmp/vice/pkg/sim"
3031
"github.com/mmp/vice/pkg/util"
3132

@@ -43,9 +44,9 @@ var (
4344
logLevel = flag.String("loglevel", "info", "logging level: debug, info, warn, error")
4445
logDir = flag.String("logdir", "", "log file directory")
4546
lintScenarios = flag.Bool("lint", false, "check the validity of the built-in scenarios")
46-
server = flag.Bool("runserver", false, "run vice scenario server")
47-
serverPort = flag.Int("port", sim.ViceServerPort, "port to listen on when running server")
48-
serverAddress = flag.String("server", sim.ViceServerAddress+fmt.Sprintf(":%d", sim.ViceServerPort), "IP address of vice multi-controller server")
47+
runServer = flag.Bool("runserver", false, "run vice scenario server")
48+
serverPort = flag.Int("port", server.ViceServerPort, "port to listen on when running server")
49+
serverAddress = flag.String("server", server.ViceServerAddress+fmt.Sprintf(":%d", server.ViceServerPort), "IP address of vice multi-controller server")
4950
scenarioFilename = flag.String("scenario", "", "filename of JSON file with a scenario definition")
5051
videoMapFilename = flag.String("videomap", "", "filename of JSON file with video map definitions")
5152
broadcastMessage = flag.String("broadcast", "", "message to broadcast to all active clients on the server")
@@ -76,7 +77,7 @@ func main() {
7677
}
7778

7879
// Initialize the logging system first and foremost.
79-
lg := log.New(*server, *logLevel, *logDir)
80+
lg := log.New(*runServer, *logLevel, *logDir)
8081

8182
profiler, err := util.CreateProfiler(*cpuprofile, *memprofile)
8283
if err != nil {
@@ -85,7 +86,7 @@ func main() {
8586
defer profiler.Cleanup()
8687

8788
if *serverAddress != "" && !strings.Contains(*serverAddress, ":") {
88-
*serverAddress += fmt.Sprintf(":%d", sim.ViceServerPort)
89+
*serverAddress += fmt.Sprintf(":%d", server.ViceServerPort)
8990
}
9091

9192
if *lintScenarios {
@@ -128,9 +129,9 @@ func main() {
128129
}
129130
os.Exit(0)
130131
} else if *broadcastMessage != "" {
131-
sim.BroadcastMessage(*serverAddress, *broadcastMessage, *broadcastPassword, lg)
132-
} else if *server {
133-
sim.RunServer(*scenarioFilename, *videoMapFilename, *serverPort, lg)
132+
server.BroadcastMessage(*serverAddress, *broadcastMessage, *broadcastPassword, lg)
133+
} else if *runServer {
134+
server.RunServer(*scenarioFilename, *videoMapFilename, *serverPort, lg)
134135
} else if *showRoutes != "" {
135136
if err := av.PrintCIFPRoutes(*showRoutes); err != nil {
136137
lg.Errorf("%s", err)
@@ -165,13 +166,13 @@ func main() {
165166

166167
config, configErr := LoadOrMakeDefaultConfig(lg)
167168

168-
var controlClient *sim.ControlClient
169-
var mgr *sim.ConnectionManager
169+
var controlClient *server.ControlClient
170+
var mgr *server.ConnectionManager
170171
var err error
171172
var simErrorLogger util.ErrorLogger
172-
mgr, err = sim.MakeServerConnection(*serverAddress, *scenarioFilename, *videoMapFilename,
173+
mgr, err = server.MakeServerConnection(*serverAddress, *scenarioFilename, *videoMapFilename,
173174
&simErrorLogger, lg,
174-
func(c *sim.ControlClient) { // updated client
175+
func(c *server.ControlClient) { // updated client
175176
if c != nil {
176177
panes.ResetSim(config.DisplayRoot, c, c.State, plat, lg)
177178
}
@@ -180,15 +181,15 @@ func main() {
180181
},
181182
func(err error) {
182183
switch err {
183-
case sim.ErrRPCVersionMismatch:
184+
case server.ErrRPCVersionMismatch:
184185
ShowErrorDialog(plat, lg,
185186
"This version of vice is incompatible with the vice multi-controller server.\n"+
186187
"If you're using an older version of vice, please upgrade to the latest\n"+
187188
"version for multi-controller support. (If you're using a beta build, then\n"+
188189
"thanks for your help testing vice; when the beta is released, the server\n"+
189190
"will be updated as well.)")
190191

191-
case sim.ErrServerDisconnected:
192+
case server.ErrServerDisconnected:
192193
ShowErrorDialog(plat, lg, "Lost connection to the vice server.")
193194
uiShowConnectDialog(mgr, false, config, plat, lg)
194195

pkg/panes/display.go

+6-5
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"github.com/mmp/vice/pkg/math"
2424
"github.com/mmp/vice/pkg/platform"
2525
"github.com/mmp/vice/pkg/renderer"
26+
"github.com/mmp/vice/pkg/server"
2627
"github.com/mmp/vice/pkg/sim"
2728
"github.com/mmp/vice/pkg/util"
2829
)
@@ -101,8 +102,8 @@ type SplitLine struct {
101102

102103
func (s *SplitLine) Activate(renderer.Renderer, platform.Platform, *sim.EventStream, *log.Logger) {}
103104
func (s *SplitLine) Deactivate() {}
104-
func (s *SplitLine) LoadedSim(*sim.ControlClient, sim.State, platform.Platform, *log.Logger) {}
105-
func (s *SplitLine) ResetSim(*sim.ControlClient, sim.State, platform.Platform, *log.Logger) {}
105+
func (s *SplitLine) LoadedSim(*server.ControlClient, sim.State, platform.Platform, *log.Logger) {}
106+
func (s *SplitLine) ResetSim(*server.ControlClient, sim.State, platform.Platform, *log.Logger) {}
106107
func (s *SplitLine) CanTakeKeyboardFocus() bool { return false }
107108
func (s *SplitLine) Hide() bool { return false }
108109

@@ -413,7 +414,7 @@ func wmPaneIsPresent(pane Pane, root *DisplayNode) bool {
413414
// hierarchy, making sure they don't inadvertently draw over other panes,
414415
// and providing mouse and keyboard events only to the Pane that should
415416
// respectively be receiving them.
416-
func DrawPanes(root *DisplayNode, p platform.Platform, r renderer.Renderer, controlClient *sim.ControlClient,
417+
func DrawPanes(root *DisplayNode, p platform.Platform, r renderer.Renderer, controlClient *server.ControlClient,
417418
menuBarHeight float32, lg *log.Logger) renderer.RendererStats {
418419
if controlClient == nil {
419420
commandBuffer := renderer.GetCommandBuffer()
@@ -643,13 +644,13 @@ func Activate(root *DisplayNode, r renderer.Renderer, p platform.Platform, event
643644
})
644645
}
645646

646-
func LoadedSim(root *DisplayNode, client *sim.ControlClient, state sim.State, pl platform.Platform, lg *log.Logger) {
647+
func LoadedSim(root *DisplayNode, client *server.ControlClient, state sim.State, pl platform.Platform, lg *log.Logger) {
647648
root.VisitPanes(func(p Pane) {
648649
p.LoadedSim(client, state, pl, lg)
649650
})
650651
}
651652

652-
func ResetSim(root *DisplayNode, client *sim.ControlClient, state sim.State, pl platform.Platform, lg *log.Logger) {
653+
func ResetSim(root *DisplayNode, client *server.ControlClient, state sim.State, pl platform.Platform, lg *log.Logger) {
653654
root.VisitPanes(func(p Pane) {
654655
p.ResetSim(client, state, pl, lg)
655656
})

pkg/panes/flightstrip.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
"github.com/mmp/vice/pkg/platform"
1818
"github.com/mmp/vice/pkg/rand"
1919
"github.com/mmp/vice/pkg/renderer"
20+
"github.com/mmp/vice/pkg/server"
2021
"github.com/mmp/vice/pkg/sim"
2122
"github.com/mmp/vice/pkg/util"
2223

@@ -171,10 +172,10 @@ func (fsp *FlightStripPane) possiblyAddAircraft(ss *sim.State, ac *av.Aircraft)
171172
}
172173
}
173174

174-
func (fsp *FlightStripPane) LoadedSim(client *sim.ControlClient, ss sim.State, pl platform.Platform, lg *log.Logger) {
175+
func (fsp *FlightStripPane) LoadedSim(client *server.ControlClient, ss sim.State, pl platform.Platform, lg *log.Logger) {
175176
}
176177

177-
func (fsp *FlightStripPane) ResetSim(client *sim.ControlClient, ss sim.State, pl platform.Platform, lg *log.Logger) {
178+
func (fsp *FlightStripPane) ResetSim(client *server.ControlClient, ss sim.State, pl platform.Platform, lg *log.Logger) {
178179
fsp.strips = nil
179180
fsp.addedAircraft = make(map[string]interface{})
180181
fsp.CIDs = make(map[string]int)

pkg/panes/messages.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import (
1616
"github.com/mmp/vice/pkg/math"
1717
"github.com/mmp/vice/pkg/platform"
1818
"github.com/mmp/vice/pkg/renderer"
19+
"github.com/mmp/vice/pkg/server"
1920
"github.com/mmp/vice/pkg/sim"
2021
"github.com/mmp/vice/pkg/util"
2122
)
@@ -91,10 +92,10 @@ func (mp *MessagesPane) Activate(r renderer.Renderer, p platform.Platform, event
9192
}
9293
}
9394

94-
func (mp *MessagesPane) LoadedSim(client *sim.ControlClient, ss sim.State, pl platform.Platform, lg *log.Logger) {
95+
func (mp *MessagesPane) LoadedSim(client *server.ControlClient, ss sim.State, pl platform.Platform, lg *log.Logger) {
9596
}
9697

97-
func (mp *MessagesPane) ResetSim(client *sim.ControlClient, ss sim.State, pl platform.Platform, lg *log.Logger) {
98+
func (mp *MessagesPane) ResetSim(client *server.ControlClient, ss sim.State, pl platform.Platform, lg *log.Logger) {
9899
mp.messages = nil
99100
}
100101

pkg/panes/panes.go

+7-6
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"github.com/mmp/vice/pkg/math"
1414
"github.com/mmp/vice/pkg/platform"
1515
"github.com/mmp/vice/pkg/renderer"
16+
"github.com/mmp/vice/pkg/server"
1617
"github.com/mmp/vice/pkg/sim"
1718
"github.com/mmp/vice/pkg/util"
1819
)
@@ -26,10 +27,10 @@ type Pane interface {
2627
Activate(r renderer.Renderer, p platform.Platform, eventStream *sim.EventStream, lg *log.Logger)
2728

2829
// LoadedSim is called when vice is restarted and a Sim is loaded from disk.
29-
LoadedSim(client *sim.ControlClient, ss sim.State, pl platform.Platform, lg *log.Logger)
30+
LoadedSim(client *server.ControlClient, ss sim.State, pl platform.Platform, lg *log.Logger)
3031

3132
// ResetSim is called when a brand new Sim is launched
32-
ResetSim(client *sim.ControlClient, ss sim.State, pl platform.Platform, lg *log.Logger)
33+
ResetSim(client *server.ControlClient, ss sim.State, pl platform.Platform, lg *log.Logger)
3334

3435
CanTakeKeyboardFocus() bool
3536
Hide() bool
@@ -42,7 +43,7 @@ type UIDrawer interface {
4243
}
4344

4445
type InfoWindowDrawer interface {
45-
DrawInfo(c *sim.ControlClient, p platform.Platform, lg *log.Logger)
46+
DrawInfo(c *server.ControlClient, p platform.Platform, lg *log.Logger)
4647
}
4748

4849
type KeyboardFocus interface {
@@ -89,7 +90,7 @@ type Context struct {
8990

9091
KeyboardFocus KeyboardFocus
9192

92-
ControlClient *sim.ControlClient
93+
ControlClient *server.ControlClient
9394
}
9495

9596
func (ctx *Context) InitializeMouse(fullDisplayExtent math.Extent2D, p platform.Platform) {
@@ -154,9 +155,9 @@ func init() {
154155
}
155156

156157
func (ep *EmptyPane) Activate(renderer.Renderer, platform.Platform, *sim.EventStream, *log.Logger) {}
157-
func (ep *EmptyPane) LoadedSim(client *sim.ControlClient, ss sim.State, pl platform.Platform, lg *log.Logger) {
158+
func (ep *EmptyPane) LoadedSim(client *server.ControlClient, ss sim.State, pl platform.Platform, lg *log.Logger) {
158159
}
159-
func (ep *EmptyPane) ResetSim(client *sim.ControlClient, ss sim.State, pl platform.Platform, lg *log.Logger) {
160+
func (ep *EmptyPane) ResetSim(client *server.ControlClient, ss sim.State, pl platform.Platform, lg *log.Logger) {
160161
}
161162
func (ep *EmptyPane) CanTakeKeyboardFocus() bool { return false }
162163
func (ep *EmptyPane) Hide() bool { return false }

pkg/panes/stars/commands.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"github.com/mmp/vice/pkg/panes"
1919
"github.com/mmp/vice/pkg/platform"
2020
"github.com/mmp/vice/pkg/renderer"
21+
"github.com/mmp/vice/pkg/server"
2122
"github.com/mmp/vice/pkg/sim"
2223
"github.com/mmp/vice/pkg/util"
2324

@@ -2103,7 +2104,7 @@ func (sp *STARSPane) runAircraftCommands(ctx *panes.Context, ac *av.Aircraft, cm
21032104
func(errStr string, remaining string) {
21042105
if errStr != "" {
21052106
sp.previewAreaInput = remaining
2106-
if err := sim.TryDecodeErrorString(errStr); err != nil {
2107+
if err := server.TryDecodeErrorString(errStr); err != nil {
21072108
err = GetSTARSError(err, ctx.Lg)
21082109
sp.displayError(err, ctx)
21092110
} else {

pkg/panes/stars/errors.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010

1111
av "github.com/mmp/vice/pkg/aviation"
1212
"github.com/mmp/vice/pkg/log"
13+
"github.com/mmp/vice/pkg/server"
1314
"github.com/mmp/vice/pkg/sim"
1415
)
1516

@@ -63,15 +64,14 @@ var (
6364

6465
var starsErrorRemap = map[error]*STARSError{
6566
sim.ErrAircraftAlreadyReleased: ErrSTARSDuplicateCommand,
66-
sim.ErrAircraftNotReleased: ErrSTARSIllegalFlight,
6767
sim.ErrBeaconMismatch: ErrSTARSBeaconMismatch,
6868
av.ErrClearedForUnexpectedApproach: ErrSTARSIllegalValue,
6969
av.ErrFixNotInRoute: ErrSTARSIllegalFix,
7070
sim.ErrIllegalACID: ErrSTARSIllegalACID,
7171
sim.ErrIllegalFunction: ErrSTARSIllegalFunction,
7272
av.ErrInvalidAltitude: ErrSTARSIllegalValue,
7373
av.ErrInvalidApproach: ErrSTARSIllegalValue,
74-
sim.ErrInvalidCommandSyntax: ErrSTARSCommandFormat,
74+
server.ErrInvalidCommandSyntax: ErrSTARSCommandFormat,
7575
av.ErrInvalidController: ErrSTARSIllegalPosition,
7676
sim.ErrInvalidDepartureController: ErrSTARSIllegalFunction,
7777
av.ErrInvalidFacility: ErrSTARSIllegalTrack,
@@ -101,7 +101,7 @@ func GetSTARSError(e error, lg *log.Logger) *STARSError {
101101
}
102102

103103
if _, ok := e.(rpc.ServerError); ok {
104-
e = sim.TryDecodeError(e)
104+
e = server.TryDecodeError(e)
105105
}
106106

107107
if se, ok := starsErrorRemap[e]; ok {

0 commit comments

Comments
 (0)