Fixed server freezing on dispose(), socket in use exception

This commit is contained in:
Anuken
2018-03-06 23:34:33 -05:00
parent a8ce961268
commit 594c49ac91
2 changed files with 12 additions and 51 deletions
+1 -1
View File
@@ -1,5 +1,5 @@
#Autogenerated file. Do not modify. #Autogenerated file. Do not modify.
#Tue Mar 06 23:17:50 EST 2018 #Tue Mar 06 23:33:29 EST 2018
version=release version=release
androidBuildCode=337 androidBuildCode=337
name=Mindustry name=Mindustry
+11 -50
View File
@@ -184,26 +184,20 @@ public class KryoServer implements ServerProvider {
connections.clear(); connections.clear();
lastconnection = 0; lastconnection = 0;
Thread thread = new Thread(() -> { async(server::close);
async(() -> {
try { try {
server.close(); if (webServer != null) webServer.stop(1);
try {
if (webServer != null) webServer.stop(1);
}catch(Exception e){
e.printStackTrace();
}
//kill them all //kill them all
for(Thread worker : Thread.getAllStackTraces().keySet()){ for (Thread worker : Thread.getAllStackTraces().keySet()) {
if(worker.getName().contains("WebSocketWorker")){ if (worker.getName().contains("WebSocketWorker")) {
worker.interrupt(); worker.interrupt();
} }
} }
}catch (Exception e){ }catch (Exception e){
Gdx.app.postRunnable(() -> {throw new RuntimeException(e);}); handleException(e);
} }
}); });
thread.setDaemon(true);
thread.start();
} }
@Override @Override
@@ -291,25 +285,7 @@ public class KryoServer implements ServerProvider {
@Override @Override
public void dispose(){ public void dispose(){
try { close();
if(serverThread != null) serverThread.interrupt();
server.dispose();
}catch (Exception e){
Log.err(e);
}
try {
if(webServer != null) webServer.stop(1);
//kill them all
for(Thread thread : Thread.getAllStackTraces().keySet()){
if(thread.getName().contains("WebSocketWorker")){
thread.interrupt();
}
}
}catch (Exception e){
Log.err(e);
}
Log.info("Disposed server."); Log.info("Disposed server.");
} }
@@ -339,25 +315,10 @@ public class KryoServer implements ServerProvider {
return null; return null;
} }
void throwErrorAndExit(){ void async(Runnable run){
Log.err("KRYONET CONNECTIONS:"); Thread thread = new Thread(run);
for(Connection c : server.getConnections()){ thread.setDaemon(true);
NetConnection k = getByKryoID(c.getID()); thread.start();
Log.err(" - Kryonet connection / ID {0} / IP {1} / NetConnection ID {2}",
c.getID(), c.getRemoteAddressTCP().getAddress().getHostAddress(), k == null ? "NOT FOUND" : k.id);
}
Log.err("NET CONNECTIONS:");
for(NetConnection c : connections){
Log.err(" - NetConnection / ID {0} / IP {1}", c.id, c.address);
}
Log.err("\nSTACK TRACE:");
StackTraceElement[] e = Thread.getAllStackTraces().get(Thread.currentThread());
for(StackTraceElement s : e){
Log.err("- {0}", s);
}
System.exit(-1);
} }
class KryoConnection extends NetConnection{ class KryoConnection extends NetConnection{