threadsafe
This commit is contained in:
@@ -619,6 +619,7 @@ namespace OpenRA
|
|||||||
|
|
||||||
public static void Disconnect()
|
public static void Disconnect()
|
||||||
{
|
{
|
||||||
|
orderManager.Dispose();
|
||||||
var shellmap = Manifest.ShellmapUid;
|
var shellmap = Manifest.ShellmapUid;
|
||||||
LobbyInfo = new Session();
|
LobbyInfo = new Session();
|
||||||
LobbyInfo.GlobalSettings.Mods = Settings.InitialMods;
|
LobbyInfo.GlobalSettings.Mods = Settings.InitialMods;
|
||||||
|
|||||||
@@ -74,15 +74,16 @@ namespace OpenRA.Network
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class NetworkConnection : EchoConnection
|
class NetworkConnection : EchoConnection, IDisposable
|
||||||
{
|
{
|
||||||
TcpClient socket;
|
TcpClient socket;
|
||||||
int clientId;
|
int clientId;
|
||||||
ConnectionState connectionState = ConnectionState.Connecting;
|
ConnectionState connectionState = ConnectionState.Connecting;
|
||||||
|
Thread t;
|
||||||
|
|
||||||
public NetworkConnection( string host, int port )
|
public NetworkConnection( string host, int port )
|
||||||
{
|
{
|
||||||
new Thread( _ =>
|
t = new Thread( _ =>
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -115,7 +116,8 @@ namespace OpenRA.Network
|
|||||||
connectionState = ConnectionState.NotConnected;
|
connectionState = ConnectionState.NotConnected;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
) { IsBackground = true }.Start();
|
) { IsBackground = true };
|
||||||
|
t.Start();
|
||||||
}
|
}
|
||||||
|
|
||||||
public override int LocalClientId { get { return clientId; } }
|
public override int LocalClientId { get { return clientId; } }
|
||||||
@@ -136,6 +138,18 @@ namespace OpenRA.Network
|
|||||||
}
|
}
|
||||||
catch (SocketException) { /* drop this on the floor; we'll pick up the disconnect from the reader thread */ }
|
catch (SocketException) { /* drop this on the floor; we'll pick up the disconnect from the reader thread */ }
|
||||||
}
|
}
|
||||||
|
bool disposed = false;
|
||||||
|
public void Dispose ()
|
||||||
|
{
|
||||||
|
if (disposed) return;
|
||||||
|
disposed = true;
|
||||||
|
GC.SuppressFinalize( this );
|
||||||
|
|
||||||
|
socket.Close();
|
||||||
|
t.Abort();
|
||||||
|
}
|
||||||
|
|
||||||
|
~NetworkConnection() { Dispose(); }
|
||||||
}
|
}
|
||||||
|
|
||||||
class ReplayConnection : IConnection
|
class ReplayConnection : IConnection
|
||||||
|
|||||||
@@ -90,6 +90,13 @@ namespace OpenRA.Server
|
|||||||
|
|
||||||
if (Environment.TickCount - lastPing > MasterPingInterval * 1000)
|
if (Environment.TickCount - lastPing > MasterPingInterval * 1000)
|
||||||
PingMasterServer();
|
PingMasterServer();
|
||||||
|
|
||||||
|
if (conns.Count() == 0)
|
||||||
|
{
|
||||||
|
listener.Stop();
|
||||||
|
GameStarted = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} ) { IsBackground = true }.Start();
|
} ) { IsBackground = true }.Start();
|
||||||
}
|
}
|
||||||
@@ -424,15 +431,6 @@ namespace OpenRA.Server
|
|||||||
if (conns.Count != 0)
|
if (conns.Count != 0)
|
||||||
SyncLobbyInfo();
|
SyncLobbyInfo();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void CloseServer()
|
|
||||||
{
|
|
||||||
while (conns.Count() != 0)
|
|
||||||
DropClient(conns.ElementAt(conns.Count() - 1), null);
|
|
||||||
if (listener != null)
|
|
||||||
listener.Stop();
|
|
||||||
GameStarted = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void SyncLobbyInfo()
|
static void SyncLobbyInfo()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -29,9 +29,7 @@ namespace OpenRA.Widgets.Delegates
|
|||||||
};
|
};
|
||||||
|
|
||||||
optionsBG.GetWidget("BUTTON_DISCONNECT").OnMouseUp = mi => {
|
optionsBG.GetWidget("BUTTON_DISCONNECT").OnMouseUp = mi => {
|
||||||
optionsBG.Visible = false;
|
optionsBG.Visible = false;
|
||||||
if (Game.IsHost)
|
|
||||||
Server.Server.CloseServer();
|
|
||||||
Game.Disconnect();
|
Game.Disconnect();
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -80,8 +80,6 @@ namespace OpenRA.Widgets.Delegates
|
|||||||
var disconnectButton = lobby.GetWidget("DISCONNECT_BUTTON");
|
var disconnectButton = lobby.GetWidget("DISCONNECT_BUTTON");
|
||||||
disconnectButton.OnMouseUp = mi =>
|
disconnectButton.OnMouseUp = mi =>
|
||||||
{
|
{
|
||||||
if (Game.IsHost)
|
|
||||||
Server.Server.CloseServer();
|
|
||||||
Game.Disconnect();
|
Game.Disconnect();
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user