fixes port-in-use deadlock
This commit is contained in:
@@ -44,7 +44,7 @@ namespace OpenRA.Server
|
|||||||
const int DownloadChunkInterval = 20000;
|
const int DownloadChunkInterval = 20000;
|
||||||
const int DownloadChunkSize = 16384;
|
const int DownloadChunkSize = 16384;
|
||||||
|
|
||||||
public static int ServerMain(string[] mods, AutoResetEvent e)
|
public static void ServerMain(string[] mods)
|
||||||
{
|
{
|
||||||
initialMods = mods;
|
initialMods = mods;
|
||||||
|
|
||||||
@@ -58,35 +58,33 @@ namespace OpenRA.Server
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
listener.Start();
|
listener.Start();
|
||||||
Console.WriteLine("Server started.");
|
|
||||||
}
|
}
|
||||||
catch (Exception)
|
catch (Exception)
|
||||||
{
|
{
|
||||||
Console.WriteLine("Server failed to start.");
|
throw new InvalidOperationException( "Unable to start server: port is already in use" );
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
e.Set(); // we're done starting up
|
new Thread( _ =>
|
||||||
|
|
||||||
for (; ; )
|
|
||||||
{
|
{
|
||||||
var checkRead = new ArrayList();
|
for( ; ; )
|
||||||
checkRead.Add(listener.Server);
|
{
|
||||||
foreach (var c in conns) checkRead.Add(c.socket);
|
var checkRead = new ArrayList();
|
||||||
|
checkRead.Add( listener.Server );
|
||||||
|
foreach( var c in conns ) checkRead.Add( c.socket );
|
||||||
|
|
||||||
var isSendingPackages = conns.Any(c => c.Stream != null);
|
var isSendingPackages = conns.Any( c => c.Stream != null );
|
||||||
|
|
||||||
/* msdn lies, -1 doesnt work. this is ~1h instead. */
|
/* msdn lies, -1 doesnt work. this is ~1h instead. */
|
||||||
Socket.Select(checkRead, null, null, isSendingPackages ? DownloadChunkInterval : -2 );
|
Socket.Select( checkRead, null, null, isSendingPackages ? DownloadChunkInterval : -2 );
|
||||||
|
|
||||||
foreach (Socket s in checkRead)
|
foreach( Socket s in checkRead )
|
||||||
if (s == listener.Server) AcceptConnection();
|
if( s == listener.Server ) AcceptConnection();
|
||||||
else conns.Single(c => c.socket == s).ReadData();
|
else conns.Single( c => c.socket == s ).ReadData();
|
||||||
|
|
||||||
foreach (var c in conns.Where(a => a.Stream != null).ToArray())
|
|
||||||
SendNextChunk(c);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
foreach( var c in conns.Where( a => a.Stream != null ).ToArray() )
|
||||||
|
SendNextChunk( c );
|
||||||
|
}
|
||||||
|
} ) { IsBackground = true }.Start();
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ChooseFreePlayerIndex()
|
static int ChooseFreePlayerIndex()
|
||||||
@@ -550,11 +548,7 @@ namespace OpenRA.Server
|
|||||||
|
|
||||||
public static void Start( string[] mods )
|
public static void Start( string[] mods )
|
||||||
{
|
{
|
||||||
var e = new AutoResetEvent(false);
|
Server.ServerMain( mods );
|
||||||
t = new Thread(() => Server.ServerMain(mods, e)) { IsBackground = true };
|
|
||||||
|
|
||||||
t.Start();
|
|
||||||
e.WaitOne(); // when the event is signaled, the server is finished initializing
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void Stop()
|
public static void Stop()
|
||||||
|
|||||||
Reference in New Issue
Block a user