From 4b587c55e9f951ad5cb45e6d1a5d4f49b41052bf Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Fri, 18 Jun 2021 00:49:28 +0300 Subject: [PATCH] =?UTF-8?q?=D1=80=D0=B5=D0=BE=D1=80=D0=B3=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20pool=20objects?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- protocol/build.gradle | 3 +- .../java/mc/protocol/buffer/NetByteBuf.java | 52 ++++++++++++------- .../protocol/handler/ProtocolHandlersBus.java | 3 +- .../handler/ProtocolInboundHandler.java | 6 ++- .../handler/codec/ProtocolDecoder.java | 10 ++-- .../handler/codec/ProtocolEncoder.java | 8 ++- .../handler/codec/ProtocolSplitter.java | 7 ++- .../mc/protocol/packets/ClientSidePacket.java | 2 +- .../client/CPlayerPositionAndLookPacket.java | 11 ++-- .../packets/play/client/PlayerLookPacket.java | 6 +-- .../play/client/PlayerPositionPacket.java | 6 +-- .../packets/play/server/ChunkDataPacket.java | 23 +++++--- .../mc/protocol/pool/LocationObjectPool.java | 37 ------------- .../java/mc/protocol/pool/LookObjectPool.java | 37 ------------- .../pool/MultiPassivateObjectPool.java | 28 ++++++++++ .../mc/protocol/pool/PacketObjectPool.java | 14 ----- .../java/mc/protocol}/pool/Passivable.java | 2 +- .../pool/PassivatePooledObjectFactory.java | 15 ++++++ .../mc/protocol/pool/ProtocolObjectPool.java | 26 ++++++++++ .../pool/SimplePooledObjectFactory.java | 22 ++++++++ .../mc/protocol/pool/SneakyObjectPool.java | 18 +++++++ settings.gradle | 1 - utils/build.gradle | 5 -- utils/gradle.properties | 2 - .../pool/PassivablePooledObjectFactory.java | 18 ------- .../mc/utils/pool/WideClassObjectPool.java | 30 ----------- 26 files changed, 198 insertions(+), 194 deletions(-) delete mode 100644 protocol/src/main/java/mc/protocol/pool/LocationObjectPool.java delete mode 100644 protocol/src/main/java/mc/protocol/pool/LookObjectPool.java create mode 100644 protocol/src/main/java/mc/protocol/pool/MultiPassivateObjectPool.java delete mode 100644 protocol/src/main/java/mc/protocol/pool/PacketObjectPool.java rename {utils/src/main/java/mc/utils => protocol/src/main/java/mc/protocol}/pool/Passivable.java (67%) create mode 100644 protocol/src/main/java/mc/protocol/pool/PassivatePooledObjectFactory.java create mode 100644 protocol/src/main/java/mc/protocol/pool/ProtocolObjectPool.java create mode 100644 protocol/src/main/java/mc/protocol/pool/SimplePooledObjectFactory.java create mode 100644 protocol/src/main/java/mc/protocol/pool/SneakyObjectPool.java delete mode 100644 utils/build.gradle delete mode 100644 utils/gradle.properties delete mode 100644 utils/src/main/java/mc/utils/pool/PassivablePooledObjectFactory.java delete mode 100644 utils/src/main/java/mc/utils/pool/WideClassObjectPool.java diff --git a/protocol/build.gradle b/protocol/build.gradle index 9458488..777c665 100644 --- a/protocol/build.gradle +++ b/protocol/build.gradle @@ -1,8 +1,7 @@ apply from: rootDir.toPath().resolve('logic.gradle').toFile() dependencies { - api project(':utils') - + implementation libs.objpool implementation libs.netty.transport implementation libs.netty.codec implementation libs.json diff --git a/protocol/src/main/java/mc/protocol/buffer/NetByteBuf.java b/protocol/src/main/java/mc/protocol/buffer/NetByteBuf.java index ef90751..e599781 100644 --- a/protocol/src/main/java/mc/protocol/buffer/NetByteBuf.java +++ b/protocol/src/main/java/mc/protocol/buffer/NetByteBuf.java @@ -3,11 +3,13 @@ package mc.protocol.buffer; import io.netty.buffer.ByteBuf; import lombok.EqualsAndHashCode; import lombok.RequiredArgsConstructor; +import lombok.Setter; import lombok.ToString; import lombok.experimental.Delegate; import lombok.extern.slf4j.Slf4j; import mc.protocol.model.text.Text; import mc.protocol.model.text.TextSerializer; +import mc.protocol.pool.Passivable; import java.nio.charset.StandardCharsets; import java.util.UUID; @@ -48,10 +50,15 @@ import java.util.UUID; @RequiredArgsConstructor @EqualsAndHashCode(callSuper = false) @ToString -public class NetByteBuf extends ByteBuf { +public class NetByteBuf extends ByteBuf implements Passivable { @Delegate - private final ByteBuf byteBuf; + private ByteBuf byteBuf; + + public NetByteBuf setByteBuf(ByteBuf byteBuf) { + this.byteBuf = byteBuf; + return this; + } public void writeUnsignedByte(int value) { byteBuf.writeByte((byte)(value & 0xFF)); @@ -120,22 +127,7 @@ public class NetByteBuf extends ByteBuf { //region VarInt public int readVarInt() { - int numRead = 0; - int result = 0; - byte read; - do { - if ((numRead + 1) > 5) { - log.warn("VarInt is too big"); - break; - } - read = readByte(); - int value = (read & 0b01111111); - result |= (value << (7 * numRead)); - - numRead++; - } while ((read & 0b10000000) != 0); - - return result; + return readVarInt(this.byteBuf); } public void writeVarInt(int value) { @@ -189,4 +181,28 @@ public class NetByteBuf extends ByteBuf { writeLong(uuid.getLeastSignificantBits()); } //endregion + + @Override + public void passivate() { + this.byteBuf = null; + } + + public static int readVarInt(ByteBuf byteBuf) { + int numRead = 0; + int result = 0; + byte read; + do { + if ((numRead + 1) > 5) { + log.warn("VarInt is too big"); + break; + } + read = byteBuf.readByte(); + int value = (read & 0b01111111); + result |= (value << (7 * numRead)); + + numRead++; + } while ((read & 0b10000000) != 0); + + return result; + } } diff --git a/protocol/src/main/java/mc/protocol/handler/ProtocolHandlersBus.java b/protocol/src/main/java/mc/protocol/handler/ProtocolHandlersBus.java index 4d7f7aa..663e247 100644 --- a/protocol/src/main/java/mc/protocol/handler/ProtocolHandlersBus.java +++ b/protocol/src/main/java/mc/protocol/handler/ProtocolHandlersBus.java @@ -5,9 +5,9 @@ import mc.protocol.State; import mc.protocol.packets.ClientSidePacket; import mc.protocol.utils.Table; -@SuppressWarnings({ "rawtypes", "unchecked" }) public class ProtocolHandlersBus { + @SuppressWarnings("rawtypes") private final Table, Handler> table = new Table<>(); public

ProtocolHandlersBus addHandler(State state, Class

packetClass, Handler

handler) { @@ -15,6 +15,7 @@ public class ProtocolHandlersBus { return this; } + @SuppressWarnings({ "rawtypes", "unchecked" }) public

void process(State state, ChannelHandlerContext ctx, P packet) { Handler handler = table.getColumnAndRow(state, packet.getClass()); diff --git a/protocol/src/main/java/mc/protocol/handler/ProtocolInboundHandler.java b/protocol/src/main/java/mc/protocol/handler/ProtocolInboundHandler.java index e5ef4e9..a535a90 100644 --- a/protocol/src/main/java/mc/protocol/handler/ProtocolInboundHandler.java +++ b/protocol/src/main/java/mc/protocol/handler/ProtocolInboundHandler.java @@ -7,6 +7,8 @@ import lombok.extern.slf4j.Slf4j; import mc.protocol.ProtocolAttributes; import mc.protocol.State; import mc.protocol.packets.ClientSidePacket; +import mc.protocol.pool.ProtocolObjectPool; +import org.apache.commons.pool2.ObjectPool; import java.io.IOException; import java.util.Objects; @@ -20,9 +22,11 @@ public class ProtocolInboundHandler extends SimpleChannelInboundHandler out) throws Exception { State state = Objects.requireNonNull(ctx.channel().attr(ProtocolAttributes.STATE).get()); - NetByteBuf netByteBuf = new NetByteBuf(in); + NetByteBuf netByteBuf = ProtocolObjectPool.getNetByteBufPool().borrowObject().setByteBuf(in); int packetId = netByteBuf.readVarInt(); Class packetClass = state.getClientSidePacketById(packetId); @@ -37,7 +37,7 @@ public class ProtocolDecoder extends ByteToMessageDecoder { log.warn("Unknown packet: State {} ; Id 0x{}", state, packetIdAsHexcode(packetId)); if (readUnknownPackets) { - UnknownPacket unknownPacket = new UnknownPacket(); + UnknownPacket unknownPacket = ProtocolObjectPool.getPacketPool().borrowObject(UnknownPacket.class); unknownPacket.setState(state); unknownPacket.setId(packetId); unknownPacket.setDataSize(netByteBuf.readableBytes()); @@ -47,13 +47,15 @@ public class ProtocolDecoder extends ByteToMessageDecoder { netByteBuf.skipBytes(netByteBuf.readableBytes()); } } else { - ClientSidePacket packet = PacketObjectPool.getInstance().getPool(packetClass).borrowObject(); + ClientSidePacket packet = ProtocolObjectPool.getPacketPool().borrowObject(packetClass); packet.readSelf(netByteBuf); if (log.isDebugEnabled()) { log.debug("IN: {}:{}", state, packet); } out.add(packet); } + + ProtocolObjectPool.getNetByteBufPool().returnObject(netByteBuf); } private static String packetIdAsHexcode(int packetId) { diff --git a/protocol/src/main/java/mc/protocol/handler/codec/ProtocolEncoder.java b/protocol/src/main/java/mc/protocol/handler/codec/ProtocolEncoder.java index ccf0ff5..b33693b 100644 --- a/protocol/src/main/java/mc/protocol/handler/codec/ProtocolEncoder.java +++ b/protocol/src/main/java/mc/protocol/handler/codec/ProtocolEncoder.java @@ -9,6 +9,7 @@ import mc.protocol.ProtocolAttributes; import mc.protocol.State; import mc.protocol.buffer.NetByteBuf; import mc.protocol.packets.ServerSidePacket; +import mc.protocol.pool.ProtocolObjectPool; import java.util.Objects; @@ -28,12 +29,15 @@ public class ProtocolEncoder extends MessageToByteEncoder { log.debug("OUT: {}:{}", state, packet); } - NetByteBuf buffer = new NetByteBuf(Unpooled.buffer()); + NetByteBuf buffer = ProtocolObjectPool.getNetByteBufPool().borrowObject().setByteBuf(Unpooled.buffer()); buffer.writeVarInt(packetId); packet.writeSelf(buffer); - NetByteBuf netByteBuf = new NetByteBuf(out); + NetByteBuf netByteBuf = ProtocolObjectPool.getNetByteBufPool().borrowObject().setByteBuf(out); netByteBuf.writeVarInt(buffer.readableBytes()); netByteBuf.writeBytes(buffer); + + ProtocolObjectPool.getNetByteBufPool().returnObject(netByteBuf); + ProtocolObjectPool.getNetByteBufPool().returnObject(buffer); } } diff --git a/protocol/src/main/java/mc/protocol/handler/codec/ProtocolSplitter.java b/protocol/src/main/java/mc/protocol/handler/codec/ProtocolSplitter.java index 0c8dc35..abb408b 100644 --- a/protocol/src/main/java/mc/protocol/handler/codec/ProtocolSplitter.java +++ b/protocol/src/main/java/mc/protocol/handler/codec/ProtocolSplitter.java @@ -5,6 +5,7 @@ import io.netty.buffer.Unpooled; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.ByteToMessageDecoder; import mc.protocol.buffer.NetByteBuf; +import mc.protocol.pool.ProtocolObjectPool; import java.util.List; @@ -12,7 +13,7 @@ public class ProtocolSplitter extends ByteToMessageDecoder { @Override protected void decode(ChannelHandlerContext ctx, ByteBuf in, List out) { - NetByteBuf netByteBuf = new NetByteBuf(in); + NetByteBuf netByteBuf = ProtocolObjectPool.getNetByteBufPool().borrowObject().setByteBuf(in); netByteBuf.markReaderIndex(); do { @@ -25,7 +26,7 @@ public class ProtocolSplitter extends ByteToMessageDecoder { } } - int sizePacket = new NetByteBuf(Unpooled.wrappedBuffer(sizePacketRaw)).readVarInt(); + int sizePacket = NetByteBuf.readVarInt(Unpooled.wrappedBuffer(sizePacketRaw)); if (netByteBuf.readableBytes() >= sizePacket) { byte[] bytes = new byte[sizePacket]; @@ -36,5 +37,7 @@ public class ProtocolSplitter extends ByteToMessageDecoder { break; } } while (netByteBuf.readableBytes() > 0); + + ProtocolObjectPool.getNetByteBufPool().returnObject(netByteBuf); } } diff --git a/protocol/src/main/java/mc/protocol/packets/ClientSidePacket.java b/protocol/src/main/java/mc/protocol/packets/ClientSidePacket.java index 060561e..e133a1d 100644 --- a/protocol/src/main/java/mc/protocol/packets/ClientSidePacket.java +++ b/protocol/src/main/java/mc/protocol/packets/ClientSidePacket.java @@ -1,7 +1,7 @@ package mc.protocol.packets; import mc.protocol.buffer.NetByteBuf; -import mc.utils.pool.Passivable; +import mc.protocol.pool.Passivable; /** * Пакеты отправляемые клиентом. diff --git a/protocol/src/main/java/mc/protocol/packets/play/client/CPlayerPositionAndLookPacket.java b/protocol/src/main/java/mc/protocol/packets/play/client/CPlayerPositionAndLookPacket.java index 159a95a..3e9b3b6 100644 --- a/protocol/src/main/java/mc/protocol/packets/play/client/CPlayerPositionAndLookPacket.java +++ b/protocol/src/main/java/mc/protocol/packets/play/client/CPlayerPositionAndLookPacket.java @@ -8,8 +8,7 @@ import mc.protocol.buffer.NetByteBuf; import mc.protocol.model.Location; import mc.protocol.model.Look; import mc.protocol.packets.ClientSidePacket; -import mc.protocol.pool.LocationObjectPool; -import mc.protocol.pool.LookObjectPool; +import mc.protocol.pool.ProtocolObjectPool; /** * Клиент сообщает о движении и повороте головы Игрока. @@ -44,20 +43,20 @@ public class CPlayerPositionAndLookPacket implements ClientSidePacket { double x = netByteBuf.readDouble(); double y = netByteBuf.readDouble(); double z = netByteBuf.readDouble(); - this.position = LocationObjectPool.borrowObject().set(x, y, z); + this.position = ProtocolObjectPool.getLocationPool().borrowObject().set(x, y, z); float yaw = netByteBuf.readFloat(); float pitch = netByteBuf.readFloat(); - this.look = LookObjectPool.borrowObject().set(yaw, pitch); + this.look = ProtocolObjectPool.getLookPool().borrowObject().set(yaw, pitch); this.onGround = netByteBuf.readBoolean(); } @Override public void passivate() { - LocationObjectPool.returnObject(this.position); + ProtocolObjectPool.getLocationPool().returnObject(this.position); this.position = null; - LookObjectPool.returnObject(this.look); + ProtocolObjectPool.getLookPool().returnObject(this.look); this.look = null; this.onGround = false; } diff --git a/protocol/src/main/java/mc/protocol/packets/play/client/PlayerLookPacket.java b/protocol/src/main/java/mc/protocol/packets/play/client/PlayerLookPacket.java index 4247613..cff9cbf 100644 --- a/protocol/src/main/java/mc/protocol/packets/play/client/PlayerLookPacket.java +++ b/protocol/src/main/java/mc/protocol/packets/play/client/PlayerLookPacket.java @@ -7,7 +7,7 @@ import lombok.ToString; import mc.protocol.buffer.NetByteBuf; import mc.protocol.model.Look; import mc.protocol.packets.ClientSidePacket; -import mc.protocol.pool.LookObjectPool; +import mc.protocol.pool.ProtocolObjectPool; /** * Клиент сообщает о повороте головы Игрока. @@ -36,14 +36,14 @@ public class PlayerLookPacket implements ClientSidePacket { public void readSelf(NetByteBuf netByteBuf) { float yaw = netByteBuf.readFloat(); float pitch = netByteBuf.readFloat(); - this.look = LookObjectPool.borrowObject().set(yaw, pitch); + this.look = ProtocolObjectPool.getLookPool().borrowObject().set(yaw, pitch); this.onGround = netByteBuf.readBoolean(); } @Override public void passivate() { - LookObjectPool.returnObject(this.look); + ProtocolObjectPool.getLookPool().returnObject(this.look); this.look = null; this.onGround = false; } diff --git a/protocol/src/main/java/mc/protocol/packets/play/client/PlayerPositionPacket.java b/protocol/src/main/java/mc/protocol/packets/play/client/PlayerPositionPacket.java index 85aa0a9..0a8bf1d 100644 --- a/protocol/src/main/java/mc/protocol/packets/play/client/PlayerPositionPacket.java +++ b/protocol/src/main/java/mc/protocol/packets/play/client/PlayerPositionPacket.java @@ -7,7 +7,7 @@ import lombok.ToString; import mc.protocol.buffer.NetByteBuf; import mc.protocol.model.Location; import mc.protocol.packets.ClientSidePacket; -import mc.protocol.pool.LocationObjectPool; +import mc.protocol.pool.ProtocolObjectPool; /** * Клиент сообщает о движении Игрока. @@ -39,14 +39,14 @@ public class PlayerPositionPacket implements ClientSidePacket { double x = netByteBuf.readDouble(); double y = netByteBuf.readDouble(); double z = netByteBuf.readDouble(); - this.position = LocationObjectPool.borrowObject().set(x, y, z); + this.position = ProtocolObjectPool.getLocationPool().borrowObject().set(x, y, z); this.onGround = netByteBuf.readBoolean(); } @Override public void passivate() { - LocationObjectPool.returnObject(this.position); + ProtocolObjectPool.getLocationPool().returnObject(this.position); this.position = null; this.onGround = false; } diff --git a/protocol/src/main/java/mc/protocol/packets/play/server/ChunkDataPacket.java b/protocol/src/main/java/mc/protocol/packets/play/server/ChunkDataPacket.java index 514bb5a..6c43570 100644 --- a/protocol/src/main/java/mc/protocol/packets/play/server/ChunkDataPacket.java +++ b/protocol/src/main/java/mc/protocol/packets/play/server/ChunkDataPacket.java @@ -4,6 +4,8 @@ import io.netty.buffer.Unpooled; import lombok.Data; import mc.protocol.buffer.NetByteBuf; import mc.protocol.packets.ServerSidePacket; +import mc.protocol.pool.ProtocolObjectPool; +import mc.protocol.pool.SneakyObjectPool; /** * Данные чанка. @@ -78,16 +80,18 @@ public class ChunkDataPacket implements ServerSidePacket { } static { - voidData = new NetByteBuf(Unpooled.buffer()); + SneakyObjectPool pool = ProtocolObjectPool.getNetByteBufPool(); + + voidData = pool.borrowObject().setByteBuf(Unpooled.buffer()); voidData.writeBoolean(true); // Is Full chunk voidData.writeVarInt(0b11111111); // Available Sections - NetByteBuf data = new NetByteBuf(Unpooled.buffer()); + NetByteBuf data = pool.borrowObject().setByteBuf(Unpooled.buffer()); for (int i = 0; i < 16; i++) { - NetByteBuf dataBuff = new NetByteBuf(Unpooled.wrappedBuffer(new byte[4096])); - NetByteBuf blockLight = new NetByteBuf(Unpooled.wrappedBuffer(new byte[2048])); - NetByteBuf skyLight = new NetByteBuf(Unpooled.wrappedBuffer(new byte[2048])); - NetByteBuf biomes = new NetByteBuf(Unpooled.wrappedBuffer(new byte[256])); + NetByteBuf dataBuff = pool.borrowObject().setByteBuf(Unpooled.wrappedBuffer(new byte[4096])); + NetByteBuf blockLight = pool.borrowObject().setByteBuf(Unpooled.wrappedBuffer(new byte[2048])); + NetByteBuf skyLight = pool.borrowObject().setByteBuf(Unpooled.wrappedBuffer(new byte[2048])); + NetByteBuf biomes = pool.borrowObject().setByteBuf(Unpooled.wrappedBuffer(new byte[256])); data.writeUnsignedByte(13); data.writeUnsignedByte(0); @@ -96,6 +100,11 @@ public class ChunkDataPacket implements ServerSidePacket { data.writeBytes(blockLight); data.writeBytes(skyLight); data.writeBytes(biomes); + + pool.returnObject(biomes); + pool.returnObject(skyLight); + pool.returnObject(blockLight); + pool.returnObject(dataBuff); } voidData.writeVarInt(data.readableBytes()); @@ -104,5 +113,7 @@ public class ChunkDataPacket implements ServerSidePacket { voidData.markReaderIndex(); voidData.markWriterIndex(); + + pool.returnObject(data); } } diff --git a/protocol/src/main/java/mc/protocol/pool/LocationObjectPool.java b/protocol/src/main/java/mc/protocol/pool/LocationObjectPool.java deleted file mode 100644 index 33b65a1..0000000 --- a/protocol/src/main/java/mc/protocol/pool/LocationObjectPool.java +++ /dev/null @@ -1,37 +0,0 @@ -package mc.protocol.pool; - -import lombok.AccessLevel; -import lombok.NoArgsConstructor; -import lombok.SneakyThrows; -import mc.protocol.model.Location; -import org.apache.commons.pool2.BasePooledObjectFactory; -import org.apache.commons.pool2.ObjectPool; -import org.apache.commons.pool2.PooledObject; -import org.apache.commons.pool2.impl.DefaultPooledObject; -import org.apache.commons.pool2.impl.GenericObjectPool; - -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class LocationObjectPool extends BasePooledObjectFactory { - - private static final ObjectPool instance = new GenericObjectPool<>(new LocationObjectPool()); - - @Override - public Location create() { - return new Location(); - } - - @Override - public PooledObject wrap(Location location) { - return new DefaultPooledObject<>(location); - } - - @SneakyThrows - public static Location borrowObject() { - return instance.borrowObject(); - } - - @SneakyThrows - public static void returnObject(Location location) { - instance.returnObject(location); - } -} diff --git a/protocol/src/main/java/mc/protocol/pool/LookObjectPool.java b/protocol/src/main/java/mc/protocol/pool/LookObjectPool.java deleted file mode 100644 index b557a90..0000000 --- a/protocol/src/main/java/mc/protocol/pool/LookObjectPool.java +++ /dev/null @@ -1,37 +0,0 @@ -package mc.protocol.pool; - -import lombok.AccessLevel; -import lombok.NoArgsConstructor; -import lombok.SneakyThrows; -import mc.protocol.model.Look; -import org.apache.commons.pool2.BasePooledObjectFactory; -import org.apache.commons.pool2.ObjectPool; -import org.apache.commons.pool2.PooledObject; -import org.apache.commons.pool2.impl.DefaultPooledObject; -import org.apache.commons.pool2.impl.GenericObjectPool; - -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class LookObjectPool extends BasePooledObjectFactory { - - private static final ObjectPool instance = new GenericObjectPool<>(new LookObjectPool()); - - @Override - public Look create() { - return new Look(); - } - - @Override - public PooledObject wrap(Look look) { - return new DefaultPooledObject<>(look); - } - - @SneakyThrows - public static Look borrowObject() { - return instance.borrowObject(); - } - - @SneakyThrows - public static void returnObject(Look look) { - instance.returnObject(look); - } -} diff --git a/protocol/src/main/java/mc/protocol/pool/MultiPassivateObjectPool.java b/protocol/src/main/java/mc/protocol/pool/MultiPassivateObjectPool.java new file mode 100644 index 0000000..58078b4 --- /dev/null +++ b/protocol/src/main/java/mc/protocol/pool/MultiPassivateObjectPool.java @@ -0,0 +1,28 @@ +package mc.protocol.pool; + +import org.apache.commons.pool2.ObjectPool; +import org.apache.commons.pool2.impl.GenericObjectPool; + +import java.util.HashMap; +import java.util.Map; + +public class MultiPassivateObjectPool { + + @SuppressWarnings("rawtypes") + private final Map mapPool = new HashMap<>(); + + @SuppressWarnings("unchecked") + public

P borrowObject(Class

clazz) throws Exception { + return (P) pool(clazz).borrowObject(); + } + + @SuppressWarnings("unchecked") + public

void returnObject(P obj) throws Exception { + pool(obj.getClass()).returnObject(obj); + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + private ObjectPool pool(Class clazz) { + return mapPool.computeIfAbsent(clazz, tClass -> new GenericObjectPool(new PassivatePooledObjectFactory(clazz))); + } +} diff --git a/protocol/src/main/java/mc/protocol/pool/PacketObjectPool.java b/protocol/src/main/java/mc/protocol/pool/PacketObjectPool.java deleted file mode 100644 index e012587..0000000 --- a/protocol/src/main/java/mc/protocol/pool/PacketObjectPool.java +++ /dev/null @@ -1,14 +0,0 @@ -package mc.protocol.pool; - -import lombok.AccessLevel; -import lombok.Getter; -import lombok.NoArgsConstructor; -import mc.protocol.packets.ClientSidePacket; -import mc.utils.pool.WideClassObjectPool; - -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class PacketObjectPool extends WideClassObjectPool { - - @Getter - private static final PacketObjectPool instance = new PacketObjectPool(); -} diff --git a/utils/src/main/java/mc/utils/pool/Passivable.java b/protocol/src/main/java/mc/protocol/pool/Passivable.java similarity index 67% rename from utils/src/main/java/mc/utils/pool/Passivable.java rename to protocol/src/main/java/mc/protocol/pool/Passivable.java index 2008ce0..856f776 100644 --- a/utils/src/main/java/mc/utils/pool/Passivable.java +++ b/protocol/src/main/java/mc/protocol/pool/Passivable.java @@ -1,4 +1,4 @@ -package mc.utils.pool; +package mc.protocol.pool; public interface Passivable { diff --git a/protocol/src/main/java/mc/protocol/pool/PassivatePooledObjectFactory.java b/protocol/src/main/java/mc/protocol/pool/PassivatePooledObjectFactory.java new file mode 100644 index 0000000..eec9a37 --- /dev/null +++ b/protocol/src/main/java/mc/protocol/pool/PassivatePooledObjectFactory.java @@ -0,0 +1,15 @@ +package mc.protocol.pool; + +import org.apache.commons.pool2.PooledObject; + +public class PassivatePooledObjectFactory extends SimplePooledObjectFactory { + + public PassivatePooledObjectFactory(Class clazz) { + super(clazz); + } + + @Override + public void passivateObject(PooledObject pooledObject) { + pooledObject.getObject().passivate(); + } +} diff --git a/protocol/src/main/java/mc/protocol/pool/ProtocolObjectPool.java b/protocol/src/main/java/mc/protocol/pool/ProtocolObjectPool.java new file mode 100644 index 0000000..ec996e6 --- /dev/null +++ b/protocol/src/main/java/mc/protocol/pool/ProtocolObjectPool.java @@ -0,0 +1,26 @@ +package mc.protocol.pool; + +import lombok.Getter; +import mc.protocol.buffer.NetByteBuf; +import mc.protocol.model.Location; +import mc.protocol.model.Look; +import mc.protocol.packets.ClientSidePacket; + +public final class ProtocolObjectPool { + + @Getter + private static final SneakyObjectPool locationPool = new SneakyObjectPool<>(new SimplePooledObjectFactory<>(Location.class)); + + @Getter + private static final SneakyObjectPool lookPool = new SneakyObjectPool<>(new SimplePooledObjectFactory<>(Look.class)); + + @Getter + private static final SneakyObjectPool netByteBufPool = new SneakyObjectPool<>(new PassivatePooledObjectFactory<>(NetByteBuf.class)); + + @Getter + private static final MultiPassivateObjectPool packetPool = new MultiPassivateObjectPool<>(); + + private ProtocolObjectPool() { + throw new UnsupportedOperationException("This is a utility class and cannot be instantiated"); + } +} diff --git a/protocol/src/main/java/mc/protocol/pool/SimplePooledObjectFactory.java b/protocol/src/main/java/mc/protocol/pool/SimplePooledObjectFactory.java new file mode 100644 index 0000000..7733ea1 --- /dev/null +++ b/protocol/src/main/java/mc/protocol/pool/SimplePooledObjectFactory.java @@ -0,0 +1,22 @@ +package mc.protocol.pool; + +import lombok.RequiredArgsConstructor; +import org.apache.commons.pool2.BasePooledObjectFactory; +import org.apache.commons.pool2.PooledObject; +import org.apache.commons.pool2.impl.DefaultPooledObject; + +@RequiredArgsConstructor +public class SimplePooledObjectFactory extends BasePooledObjectFactory { + + private final Class clazz; + + @Override + public T create() throws Exception { + return clazz.getDeclaredConstructor().newInstance(); + } + + @Override + public PooledObject wrap(T obj) { + return new DefaultPooledObject<>(obj); + } +} diff --git a/protocol/src/main/java/mc/protocol/pool/SneakyObjectPool.java b/protocol/src/main/java/mc/protocol/pool/SneakyObjectPool.java new file mode 100644 index 0000000..a1398ad --- /dev/null +++ b/protocol/src/main/java/mc/protocol/pool/SneakyObjectPool.java @@ -0,0 +1,18 @@ +package mc.protocol.pool; + +import lombok.SneakyThrows; +import org.apache.commons.pool2.PooledObjectFactory; +import org.apache.commons.pool2.impl.GenericObjectPool; + +public class SneakyObjectPool extends GenericObjectPool { + + public SneakyObjectPool(PooledObjectFactory factory) { + super(factory); + } + + @Override + @SneakyThrows + public T borrowObject() { + return super.borrowObject(); + } +} diff --git a/settings.gradle b/settings.gradle index e9e2a61..f19ef5f 100644 --- a/settings.gradle +++ b/settings.gradle @@ -10,7 +10,6 @@ rootProject.projectDir.toPath().resolve('gradle.properties').readLines().forEach rootProject.name = map.get('prj.name') -include('utils') include('cli-parser') include('protocol') include('server') diff --git a/utils/build.gradle b/utils/build.gradle deleted file mode 100644 index 8cb5346..0000000 --- a/utils/build.gradle +++ /dev/null @@ -1,5 +0,0 @@ -apply from: rootDir.toPath().resolve('logic.gradle').toFile() - -dependencies { - api libs.objpool -} diff --git a/utils/gradle.properties b/utils/gradle.properties deleted file mode 100644 index dfe1133..0000000 --- a/utils/gradle.properties +++ /dev/null @@ -1,2 +0,0 @@ -# suppress inspection "UnusedProperty" for whole file -module.name=utils \ No newline at end of file diff --git a/utils/src/main/java/mc/utils/pool/PassivablePooledObjectFactory.java b/utils/src/main/java/mc/utils/pool/PassivablePooledObjectFactory.java deleted file mode 100644 index 070a25a..0000000 --- a/utils/src/main/java/mc/utils/pool/PassivablePooledObjectFactory.java +++ /dev/null @@ -1,18 +0,0 @@ -package mc.utils.pool; - -import org.apache.commons.pool2.BasePooledObjectFactory; -import org.apache.commons.pool2.PooledObject; -import org.apache.commons.pool2.impl.DefaultPooledObject; - -public abstract class PassivablePooledObjectFactory extends BasePooledObjectFactory { - - @Override - public PooledObject wrap(T obj) { - return new DefaultPooledObject<>(obj); - } - - @Override - public void passivateObject(PooledObject pooledObject) { - pooledObject.getObject().passivate(); - } -} diff --git a/utils/src/main/java/mc/utils/pool/WideClassObjectPool.java b/utils/src/main/java/mc/utils/pool/WideClassObjectPool.java deleted file mode 100644 index 2b7cfcc..0000000 --- a/utils/src/main/java/mc/utils/pool/WideClassObjectPool.java +++ /dev/null @@ -1,30 +0,0 @@ -package mc.utils.pool; - -import lombok.RequiredArgsConstructor; -import org.apache.commons.pool2.ObjectPool; -import org.apache.commons.pool2.impl.GenericObjectPool; - -import java.util.HashMap; -import java.util.Map; - -@SuppressWarnings({ "rawtypes", "unchecked" }) -public abstract class WideClassObjectPool { - - private final Map mapPool = new HashMap<>(); - - @SuppressWarnings("unused") - public ObjectPool getPool(Class clazz) { - return mapPool.computeIfAbsent(clazz, tClass -> new GenericObjectPool(new WideClassFactory(clazz))); - } - - @RequiredArgsConstructor - private class WideClassFactory extends PassivablePooledObjectFactory { - - private final Class clazz; - - @Override - public R create() throws Exception { - return clazz.getDeclaredConstructor().newInstance(); - } - } -}