From bb3f0bbdcb47c44cd715f943e6d41868b66008bc Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 19 Jun 2021 16:46:45 +0300 Subject: [PATCH] refactoring object pool --- .../packets/play/server/ChunkDataPacket.java | 4 +-- .../mc/protocol/pool/MultiObjectPool.java | 8 ++++++ .../pool/MultiPassivateObjectPool.java | 28 ------------------- .../java/mc/protocol/pool/ObjectPool.java | 8 ++++++ .../pool/PassivableMultiObjectPool.java | 27 ++++++++++++++++++ .../protocol/pool/PassivableObjectPool.java | 27 ++++++++++++++++++ ...ava => PassivablePooledObjectFactory.java} | 4 +-- .../mc/protocol/pool/ProtocolObjectPool.java | 15 +++++----- .../mc/protocol/pool/SimpleObjectPool.java | 27 ++++++++++++++++++ .../pool/SimplePooledObjectFactory.java | 2 +- .../mc/protocol/pool/SneakyObjectPool.java | 18 ------------ 11 files changed, 109 insertions(+), 59 deletions(-) create mode 100644 protocol/src/main/java/mc/protocol/pool/MultiObjectPool.java delete mode 100644 protocol/src/main/java/mc/protocol/pool/MultiPassivateObjectPool.java create mode 100644 protocol/src/main/java/mc/protocol/pool/ObjectPool.java create mode 100644 protocol/src/main/java/mc/protocol/pool/PassivableMultiObjectPool.java create mode 100644 protocol/src/main/java/mc/protocol/pool/PassivableObjectPool.java rename protocol/src/main/java/mc/protocol/pool/{PassivatePooledObjectFactory.java => PassivablePooledObjectFactory.java} (57%) create mode 100644 protocol/src/main/java/mc/protocol/pool/SimpleObjectPool.java delete mode 100644 protocol/src/main/java/mc/protocol/pool/SneakyObjectPool.java 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 6c43570..89af3dc 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,8 +4,8 @@ import io.netty.buffer.Unpooled; import lombok.Data; import mc.protocol.buffer.NetByteBuf; import mc.protocol.packets.ServerSidePacket; +import mc.protocol.pool.ObjectPool; import mc.protocol.pool.ProtocolObjectPool; -import mc.protocol.pool.SneakyObjectPool; /** * Данные чанка. @@ -80,7 +80,7 @@ public class ChunkDataPacket implements ServerSidePacket { } static { - SneakyObjectPool pool = ProtocolObjectPool.getNetByteBufPool(); + ObjectPool pool = ProtocolObjectPool.getNetByteBufPool(); voidData = pool.borrowObject().setByteBuf(Unpooled.buffer()); voidData.writeBoolean(true); // Is Full chunk diff --git a/protocol/src/main/java/mc/protocol/pool/MultiObjectPool.java b/protocol/src/main/java/mc/protocol/pool/MultiObjectPool.java new file mode 100644 index 0000000..e7dcbbd --- /dev/null +++ b/protocol/src/main/java/mc/protocol/pool/MultiObjectPool.java @@ -0,0 +1,8 @@ +package mc.protocol.pool; + +public interface MultiObjectPool { + +

P borrowObject(Class

clazz); + +

void returnObject(P object); +} diff --git a/protocol/src/main/java/mc/protocol/pool/MultiPassivateObjectPool.java b/protocol/src/main/java/mc/protocol/pool/MultiPassivateObjectPool.java deleted file mode 100644 index 58078b4..0000000 --- a/protocol/src/main/java/mc/protocol/pool/MultiPassivateObjectPool.java +++ /dev/null @@ -1,28 +0,0 @@ -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/ObjectPool.java b/protocol/src/main/java/mc/protocol/pool/ObjectPool.java new file mode 100644 index 0000000..0fd1df1 --- /dev/null +++ b/protocol/src/main/java/mc/protocol/pool/ObjectPool.java @@ -0,0 +1,8 @@ +package mc.protocol.pool; + +public interface ObjectPool { + + T borrowObject(); + + void returnObject(T object); +} diff --git a/protocol/src/main/java/mc/protocol/pool/PassivableMultiObjectPool.java b/protocol/src/main/java/mc/protocol/pool/PassivableMultiObjectPool.java new file mode 100644 index 0000000..c25bc40 --- /dev/null +++ b/protocol/src/main/java/mc/protocol/pool/PassivableMultiObjectPool.java @@ -0,0 +1,27 @@ +package mc.protocol.pool; + +import java.util.HashMap; +import java.util.Map; + +public class PassivableMultiObjectPool implements MultiObjectPool { + + @SuppressWarnings("rawtypes") + private final Map mapPool = new HashMap<>(); + + @SuppressWarnings("unchecked") + @Override + public

P borrowObject(Class

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

void returnObject(P object) { + pool(object.getClass()).returnObject(object); + } + + @SuppressWarnings({ "rawtypes", "unchecked", "RedundantSuppression" }) + private ObjectPool pool(Class clazz) { + return mapPool.computeIfAbsent(clazz, PassivableObjectPool::new); + } +} diff --git a/protocol/src/main/java/mc/protocol/pool/PassivableObjectPool.java b/protocol/src/main/java/mc/protocol/pool/PassivableObjectPool.java new file mode 100644 index 0000000..e9facea --- /dev/null +++ b/protocol/src/main/java/mc/protocol/pool/PassivableObjectPool.java @@ -0,0 +1,27 @@ +package mc.protocol.pool; + +import lombok.SneakyThrows; +import org.apache.commons.pool2.impl.GenericObjectPool; + +import javax.annotation.Nonnull; + +public class PassivableObjectPool implements ObjectPool { + + private final org.apache.commons.pool2.ObjectPool apacheObjectPool; + + public PassivableObjectPool(@Nonnull Class clazz) { + apacheObjectPool = new GenericObjectPool<>(new PassivablePooledObjectFactory<>(clazz)); + } + + @Override + @SneakyThrows + public T borrowObject() { + return apacheObjectPool.borrowObject(); + } + + @Override + @SneakyThrows + public void returnObject(T object) { + apacheObjectPool.returnObject(object); + } +} diff --git a/protocol/src/main/java/mc/protocol/pool/PassivatePooledObjectFactory.java b/protocol/src/main/java/mc/protocol/pool/PassivablePooledObjectFactory.java similarity index 57% rename from protocol/src/main/java/mc/protocol/pool/PassivatePooledObjectFactory.java rename to protocol/src/main/java/mc/protocol/pool/PassivablePooledObjectFactory.java index eec9a37..8ed82eb 100644 --- a/protocol/src/main/java/mc/protocol/pool/PassivatePooledObjectFactory.java +++ b/protocol/src/main/java/mc/protocol/pool/PassivablePooledObjectFactory.java @@ -2,9 +2,9 @@ package mc.protocol.pool; import org.apache.commons.pool2.PooledObject; -public class PassivatePooledObjectFactory extends SimplePooledObjectFactory { +class PassivablePooledObjectFactory extends SimplePooledObjectFactory { - public PassivatePooledObjectFactory(Class clazz) { + PassivablePooledObjectFactory(Class clazz) { super(clazz); } diff --git a/protocol/src/main/java/mc/protocol/pool/ProtocolObjectPool.java b/protocol/src/main/java/mc/protocol/pool/ProtocolObjectPool.java index ec996e6..7763289 100644 --- a/protocol/src/main/java/mc/protocol/pool/ProtocolObjectPool.java +++ b/protocol/src/main/java/mc/protocol/pool/ProtocolObjectPool.java @@ -1,26 +1,25 @@ package mc.protocol.pool; +import lombok.AccessLevel; import lombok.Getter; +import lombok.NoArgsConstructor; import mc.protocol.buffer.NetByteBuf; import mc.protocol.model.Location; import mc.protocol.model.Look; import mc.protocol.packets.ClientSidePacket; +@NoArgsConstructor(access = AccessLevel.PRIVATE) public final class ProtocolObjectPool { @Getter - private static final SneakyObjectPool locationPool = new SneakyObjectPool<>(new SimplePooledObjectFactory<>(Location.class)); + private static final ObjectPool locationPool = new SimpleObjectPool<>(Location.class); @Getter - private static final SneakyObjectPool lookPool = new SneakyObjectPool<>(new SimplePooledObjectFactory<>(Look.class)); + private static final ObjectPool lookPool = new SimpleObjectPool<>(Look.class); @Getter - private static final SneakyObjectPool netByteBufPool = new SneakyObjectPool<>(new PassivatePooledObjectFactory<>(NetByteBuf.class)); + private static final ObjectPool netByteBufPool = new PassivableObjectPool<>(NetByteBuf.class); @Getter - private static final MultiPassivateObjectPool packetPool = new MultiPassivateObjectPool<>(); - - private ProtocolObjectPool() { - throw new UnsupportedOperationException("This is a utility class and cannot be instantiated"); - } + private static final MultiObjectPool packetPool = new PassivableMultiObjectPool<>(); } diff --git a/protocol/src/main/java/mc/protocol/pool/SimpleObjectPool.java b/protocol/src/main/java/mc/protocol/pool/SimpleObjectPool.java new file mode 100644 index 0000000..b0402bb --- /dev/null +++ b/protocol/src/main/java/mc/protocol/pool/SimpleObjectPool.java @@ -0,0 +1,27 @@ +package mc.protocol.pool; + +import lombok.SneakyThrows; +import org.apache.commons.pool2.impl.GenericObjectPool; + +import javax.annotation.Nonnull; + +public class SimpleObjectPool implements ObjectPool { + + private final org.apache.commons.pool2.ObjectPool apacheObjectPool; + + public SimpleObjectPool(@Nonnull Class clazz) { + apacheObjectPool = new GenericObjectPool<>(new SimplePooledObjectFactory<>(clazz)); + } + + @Override + @SneakyThrows + public T borrowObject() { + return apacheObjectPool.borrowObject(); + } + + @Override + @SneakyThrows + public void returnObject(T object) { + apacheObjectPool.returnObject(object); + } +} diff --git a/protocol/src/main/java/mc/protocol/pool/SimplePooledObjectFactory.java b/protocol/src/main/java/mc/protocol/pool/SimplePooledObjectFactory.java index 7733ea1..9a0694b 100644 --- a/protocol/src/main/java/mc/protocol/pool/SimplePooledObjectFactory.java +++ b/protocol/src/main/java/mc/protocol/pool/SimplePooledObjectFactory.java @@ -6,7 +6,7 @@ import org.apache.commons.pool2.PooledObject; import org.apache.commons.pool2.impl.DefaultPooledObject; @RequiredArgsConstructor -public class SimplePooledObjectFactory extends BasePooledObjectFactory { +class SimplePooledObjectFactory extends BasePooledObjectFactory { private final Class clazz; diff --git a/protocol/src/main/java/mc/protocol/pool/SneakyObjectPool.java b/protocol/src/main/java/mc/protocol/pool/SneakyObjectPool.java deleted file mode 100644 index a1398ad..0000000 --- a/protocol/src/main/java/mc/protocol/pool/SneakyObjectPool.java +++ /dev/null @@ -1,18 +0,0 @@ -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(); - } -}