Fixed some synchronization bugs

This commit is contained in:
Josh Larson
2016-05-02 15:16:55 -05:00
parent c0ce6e832a
commit dfd3cd16f5
4 changed files with 27 additions and 21 deletions
-6
View File
@@ -27,12 +27,6 @@ public class ClientConnection extends Manager {
return interceptor.getProperties();
}
public boolean initialize() {
if (!super.initialize())
return false;
return true;
}
public boolean start() {
if (!super.start())
return false;
+2 -2
View File
@@ -65,12 +65,12 @@ public class ClientSender extends Service {
port = 0;
zone = false;
serverRunning.set(false);
packager.start();
resender.start();
try {
loginServer = new UDPServer(loginPort, 496);
zoneServer = new UDPServer(0, 496);
loginPort = loginServer.getPort();
packager.start();
resender.start();
serverRunning.set(true);
} catch (BindException e) {
Log.err(this, "Failed to bind UDP servers! Login Port: " + loginPort);
+20 -13
View File
@@ -160,15 +160,20 @@ public class ServerConnection extends Manager {
}
private boolean processPacket() {
bufferStream.mark();
byte bitmask = bufferStream.getByte();
short messageLength = bufferStream.getShort();
short decompressedLength = bufferStream.getShort();
if (bufferStream.remaining() < messageLength) {
bufferStream.rewind();
return false;
byte bitmask;
short messageLength, decompressedLength;
byte [] message;
synchronized (bufferStream) {
bufferStream.mark();
bitmask = bufferStream.getByte();
messageLength = bufferStream.getShort();
decompressedLength = bufferStream.getShort();
if (bufferStream.remaining() < messageLength) {
bufferStream.rewind();
return false;
}
message = bufferStream.getArray(messageLength);
}
byte [] message = bufferStream.getArray(messageLength);
if ((bitmask & 1) != 0) // Compressed
message = Compression.decompress(message, decompressedLength);
if (message.length < 6)
@@ -292,17 +297,19 @@ public class ServerConnection extends Manager {
}
private void process() {
while (bufferStream.remaining() >= 5) {
if (!processPacket())
break;
}
synchronized (bufferMutex) {
while (bufferStream.remaining() >= 5) {
if (!processPacket())
break;
}
bufferStream.compact();
}
}
private void reset() {
bufferStream.reset();
synchronized (bufferMutex) {
bufferStream.reset();
}
}
private boolean connect() {
@@ -87,6 +87,11 @@ public class UDPServer {
}
public int getPort() {
port = socket.getLocalPort();
while (port == 0) {
port = socket.getLocalPort();
try { Thread.sleep(5); } catch (InterruptedException e) { break; }
}
return port;
}