From 085d30952846b2fdea9e2e4899cdf2555b658414 Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 27 Jun 2018 14:55:37 -0400 Subject: [PATCH] Added packet pooling synchronization --- core/src/io/anuke/mindustry/net/Net.java | 14 +++++++++++--- kryonet/src/io/anuke/kryonet/ByteSerializer.java | 14 ++++++++++---- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/core/src/io/anuke/mindustry/net/Net.java b/core/src/io/anuke/mindustry/net/Net.java index ab2261ae95..5417634ebf 100644 --- a/core/src/io/anuke/mindustry/net/Net.java +++ b/core/src/io/anuke/mindustry/net/Net.java @@ -26,6 +26,8 @@ import java.io.IOException; import static io.anuke.mindustry.Vars.*; public class Net{ + public static final Object packetPoolLock = new Object(); + private static boolean server; private static boolean active; private static boolean clientLoaded; @@ -183,12 +185,16 @@ public class Net{ if(clientLoaded || object instanceof ImportantPacket){ if(clientListeners.get(object.getClass()) != null) clientListeners.get(object.getClass()).accept(object); if(listeners.get(object.getClass()) != null) listeners.get(object.getClass()).accept(object); - Pools.free(object); + synchronized (packetPoolLock) { + Pools.free(object); + } }else if(!(object instanceof UnimportantPacket)){ packetQueue.add(object); Log.info("Queuing packet {0}.", ClassReflection.getSimpleName(object.getClass())); }else{ - Pools.free(object); + synchronized (packetPoolLock) { + Pools.free(object); + } } }else{ Log.err("Unhandled packet type: '{0}'!", ClassReflection.getSimpleName(object.getClass())); @@ -201,7 +207,9 @@ public class Net{ if(serverListeners.get(object.getClass()) != null || listeners.get(object.getClass()) != null){ if(serverListeners.get(object.getClass()) != null) serverListeners.get(object.getClass()).accept(connection, object); if(listeners.get(object.getClass()) != null) listeners.get(object.getClass()).accept(object); - Pools.free(object); + synchronized (packetPoolLock) { + Pools.free(object); + } }else{ Log.err("Unhandled packet type: '{0}'!", ClassReflection.getSimpleName(object.getClass())); } diff --git a/kryonet/src/io/anuke/kryonet/ByteSerializer.java b/kryonet/src/io/anuke/kryonet/ByteSerializer.java index 7a032af514..e28d8555df 100644 --- a/kryonet/src/io/anuke/kryonet/ByteSerializer.java +++ b/kryonet/src/io/anuke/kryonet/ByteSerializer.java @@ -9,6 +9,8 @@ import io.anuke.mindustry.net.Registrator; import java.nio.ByteBuffer; +import static io.anuke.mindustry.net.Net.packetPoolLock; + public class ByteSerializer implements Serialization { @Override @@ -24,7 +26,9 @@ public class ByteSerializer implements Serialization { throw new RuntimeException("Unregistered class: " + ClassReflection.getSimpleName(o.getClass())); byteBuffer.put(id); ((Packet) o).write(byteBuffer); - Pools.free(o); + synchronized (packetPoolLock) { + Pools.free(o); + } } } @@ -35,9 +39,11 @@ public class ByteSerializer implements Serialization { return FrameworkSerializer.read(byteBuffer); }else{ Class type = Registrator.getByID(id); - Packet packet = (Packet)Pools.obtain(type); - packet.read(byteBuffer); - return packet; + synchronized (packetPoolLock) { + Packet packet = (Packet) Pools.obtain(type); + packet.read(byteBuffer); + return packet; + } } }