Archived
0

refactoring object pool

This commit is contained in:
2021-06-19 16:46:45 +03:00
parent b1307442e1
commit bb3f0bbdcb
11 changed files with 109 additions and 59 deletions

View File

@@ -4,8 +4,8 @@ import io.netty.buffer.Unpooled;
import lombok.Data; import lombok.Data;
import mc.protocol.buffer.NetByteBuf; import mc.protocol.buffer.NetByteBuf;
import mc.protocol.packets.ServerSidePacket; import mc.protocol.packets.ServerSidePacket;
import mc.protocol.pool.ObjectPool;
import mc.protocol.pool.ProtocolObjectPool; import mc.protocol.pool.ProtocolObjectPool;
import mc.protocol.pool.SneakyObjectPool;
/** /**
* Данные чанка. * Данные чанка.
@@ -80,7 +80,7 @@ public class ChunkDataPacket implements ServerSidePacket {
} }
static { static {
SneakyObjectPool<NetByteBuf> pool = ProtocolObjectPool.getNetByteBufPool(); ObjectPool<NetByteBuf> pool = ProtocolObjectPool.getNetByteBufPool();
voidData = pool.borrowObject().setByteBuf(Unpooled.buffer()); voidData = pool.borrowObject().setByteBuf(Unpooled.buffer());
voidData.writeBoolean(true); // Is Full chunk voidData.writeBoolean(true); // Is Full chunk

View File

@@ -0,0 +1,8 @@
package mc.protocol.pool;
public interface MultiObjectPool<T> {
<P extends T> P borrowObject(Class<P> clazz);
<P extends T> void returnObject(P object);
}

View File

@@ -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<T extends Passivable> {
@SuppressWarnings("rawtypes")
private final Map<Class, ObjectPool> mapPool = new HashMap<>();
@SuppressWarnings("unchecked")
public <P extends T> P borrowObject(Class<P> clazz) throws Exception {
return (P) pool(clazz).borrowObject();
}
@SuppressWarnings("unchecked")
public <P extends T> 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)));
}
}

View File

@@ -0,0 +1,8 @@
package mc.protocol.pool;
public interface ObjectPool<T> {
T borrowObject();
void returnObject(T object);
}

View File

@@ -0,0 +1,27 @@
package mc.protocol.pool;
import java.util.HashMap;
import java.util.Map;
public class PassivableMultiObjectPool<T extends Passivable> implements MultiObjectPool<T> {
@SuppressWarnings("rawtypes")
private final Map<Class, ObjectPool> mapPool = new HashMap<>();
@SuppressWarnings("unchecked")
@Override
public <P extends T> P borrowObject(Class<P> clazz) {
return (P) pool(clazz).borrowObject();
}
@SuppressWarnings("unchecked")
@Override
public <P extends T> void returnObject(P object) {
pool(object.getClass()).returnObject(object);
}
@SuppressWarnings({ "rawtypes", "unchecked", "RedundantSuppression" })
private ObjectPool pool(Class clazz) {
return mapPool.computeIfAbsent(clazz, PassivableObjectPool::new);
}
}

View File

@@ -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<T extends Passivable> implements ObjectPool<T> {
private final org.apache.commons.pool2.ObjectPool<T> apacheObjectPool;
public PassivableObjectPool(@Nonnull Class<T> 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);
}
}

View File

@@ -2,9 +2,9 @@ package mc.protocol.pool;
import org.apache.commons.pool2.PooledObject; import org.apache.commons.pool2.PooledObject;
public class PassivatePooledObjectFactory<T extends Passivable> extends SimplePooledObjectFactory<T> { class PassivablePooledObjectFactory<T extends Passivable> extends SimplePooledObjectFactory<T> {
public PassivatePooledObjectFactory(Class<T> clazz) { PassivablePooledObjectFactory(Class<T> clazz) {
super(clazz); super(clazz);
} }

View File

@@ -1,26 +1,25 @@
package mc.protocol.pool; package mc.protocol.pool;
import lombok.AccessLevel;
import lombok.Getter; import lombok.Getter;
import lombok.NoArgsConstructor;
import mc.protocol.buffer.NetByteBuf; import mc.protocol.buffer.NetByteBuf;
import mc.protocol.model.Location; import mc.protocol.model.Location;
import mc.protocol.model.Look; import mc.protocol.model.Look;
import mc.protocol.packets.ClientSidePacket; import mc.protocol.packets.ClientSidePacket;
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class ProtocolObjectPool { public final class ProtocolObjectPool {
@Getter @Getter
private static final SneakyObjectPool<Location> locationPool = new SneakyObjectPool<>(new SimplePooledObjectFactory<>(Location.class)); private static final ObjectPool<Location> locationPool = new SimpleObjectPool<>(Location.class);
@Getter @Getter
private static final SneakyObjectPool<Look> lookPool = new SneakyObjectPool<>(new SimplePooledObjectFactory<>(Look.class)); private static final ObjectPool<Look> lookPool = new SimpleObjectPool<>(Look.class);
@Getter @Getter
private static final SneakyObjectPool<NetByteBuf> netByteBufPool = new SneakyObjectPool<>(new PassivatePooledObjectFactory<>(NetByteBuf.class)); private static final ObjectPool<NetByteBuf> netByteBufPool = new PassivableObjectPool<>(NetByteBuf.class);
@Getter @Getter
private static final MultiPassivateObjectPool<ClientSidePacket> packetPool = new MultiPassivateObjectPool<>(); private static final MultiObjectPool<ClientSidePacket> packetPool = new PassivableMultiObjectPool<>();
private ProtocolObjectPool() {
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
}
} }

View File

@@ -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<T> implements ObjectPool<T> {
private final org.apache.commons.pool2.ObjectPool<T> apacheObjectPool;
public SimpleObjectPool(@Nonnull Class<T> 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);
}
}

View File

@@ -6,7 +6,7 @@ import org.apache.commons.pool2.PooledObject;
import org.apache.commons.pool2.impl.DefaultPooledObject; import org.apache.commons.pool2.impl.DefaultPooledObject;
@RequiredArgsConstructor @RequiredArgsConstructor
public class SimplePooledObjectFactory<T> extends BasePooledObjectFactory<T> { class SimplePooledObjectFactory<T> extends BasePooledObjectFactory<T> {
private final Class<T> clazz; private final Class<T> clazz;

View File

@@ -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<T> extends GenericObjectPool<T> {
public SneakyObjectPool(PooledObjectFactory<T> factory) {
super(factory);
}
@Override
@SneakyThrows
public T borrowObject() {
return super.borrowObject();
}
}