Work around a race condition with local servers.

This commit is contained in:
Paul Chote
2011-05-10 17:49:33 +12:00
parent 33a4f5e29e
commit 814845730f
3 changed files with 24 additions and 18 deletions

View File

@@ -350,16 +350,17 @@ namespace OpenRA
{
if (orderManager.world != null)
orderManager.world.traitDict.PrintReport();
if (IsHost && server != null)
{
Console.WriteLine("Closing server");
server.Shutdown();
}
CloseServer();
JoinLocal();
orderManager.Dispose();
}
public static void CloseServer()
{
if (server != null)
server.Shutdown();
}
public static T CreateObject<T>( string name )
{
return modData.ObjectCreator.CreateObject<T>( name );

View File

@@ -74,17 +74,21 @@ namespace OpenRA.Server
Log.Write("server", "Initial map: {0}",lobbyInfo.GlobalSettings.Map);
new Thread( _ =>
{
while (true)
{
try
{
listener.Start();
break;
}
catch (Exception)
{
throw new InvalidOperationException( "Unable to start server: port is already in use" );
Thread.Sleep(100);
}
}
new Thread( _ =>
{
var timeout = ServerTraits.WithInterface<ITick>().Min(t => t.TickTimeout);
for( ; ; )
{
@@ -94,6 +98,8 @@ namespace OpenRA.Server
foreach( var c in preConns ) checkRead.Add( c.socket );
Socket.Select( checkRead, null, null, timeout );
if (shutdown)
break;
foreach( Socket s in checkRead )
if( s == listener.Server ) AcceptConnection();
@@ -110,7 +116,6 @@ namespace OpenRA.Server
if (shutdown)
break;
}
Console.WriteLine("Server loop finished");
GameStarted = false;
foreach (var t in ServerTraits.WithInterface<INotifyServerShutdown>())

View File

@@ -135,7 +135,7 @@ namespace OpenRA.Mods.Cnc.Widgets
CncConnectingLogic.Connect(IPAddress.Loopback.ToString(),
Game.Settings.Server.LoopbackPort,
new Action(() => OpenLobbyPanel(MenuType.Main)),
new Action(() => ReturnToMenu(MenuType.Main)));
new Action(() => { Game.CloseServer(); ReturnToMenu(MenuType.Main); }));
}
}
}