Skip to content

Commit 569199d

Browse files
committed
regenerate buffers to reduce risk of memleak, might help #1
1 parent 8b0ccce commit 569199d

File tree

1 file changed

+24
-11
lines changed

1 file changed

+24
-11
lines changed

src/main/java/com/denizenscript/depenizen/bungee/DepenizenConnection.java

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ public void run() {
7575

7676
public Channel channel;
7777

78-
public ByteBuf tmp;
78+
public ByteBuf packetBuffer;
7979

8080
public int waitingLength;
8181

@@ -107,17 +107,29 @@ public void sendPacket(PacketOut packet) {
107107
channel.writeAndFlush(buf);
108108
}
109109

110+
public void reallocateBuf(ChannelHandlerContext ctx) {
111+
ByteBuf newBuf = ctx.alloc().buffer(4);
112+
if (packetBuffer != null) {
113+
newBuf.writeBytes(packetBuffer);
114+
packetBuffer.release();
115+
}
116+
packetBuffer = newBuf;
117+
}
118+
110119
@Override
111120
public void handlerAdded(ChannelHandlerContext ctx) {
112-
tmp = ctx.alloc().buffer(4);
121+
if (packetBuffer != null) {
122+
packetBuffer.release();
123+
}
124+
packetBuffer = ctx.alloc().buffer(4);
113125
lastPacketReceived = System.currentTimeMillis();
114126
}
115127

116128
@Override
117129
public void handlerRemoved(ChannelHandlerContext ctx) {
118130
DepenizenBungee.instance.getLogger().info("Connection '" + connectionName + "' ended.");
119-
tmp.release();
120-
tmp = null;
131+
packetBuffer.release();
132+
packetBuffer = null;
121133
isValid = false;
122134
DepenizenBungee.instance.removeConnection(this);
123135
broadcastRemoval();
@@ -130,15 +142,15 @@ public void handlerRemoved(ChannelHandlerContext ctx) {
130142
@Override
131143
public void channelRead(ChannelHandlerContext ctx, Object msg) {
132144
ByteBuf m = (ByteBuf) msg;
133-
tmp.writeBytes(m);
145+
packetBuffer.writeBytes(m);
134146
m.release();
135147
if (currentStage == Stage.AWAIT_HEADER) {
136-
if (tmp.readableBytes() >= 8) {
137-
waitingLength = tmp.readInt();
138-
packetId = tmp.readInt();
148+
if (packetBuffer.readableBytes() >= 8) {
149+
waitingLength = packetBuffer.readInt();
150+
packetId = packetBuffer.readInt();
139151
currentStage = Stage.AWAIT_DATA;
140152
if (thisServer == null && packetId != MyInfoPacketIn.PACKET_ID) {
141-
fail("Invalid FIRST packet id (must be MyInfoPacket): " + packetId + ", data length thus far = " + tmp.readableBytes());
153+
fail("Invalid FIRST packet id (must be MyInfoPacket): " + packetId + ", data length thus far = " + packetBuffer.readableBytes());
142154
return;
143155
}
144156
if (!DepenizenBungee.instance.packets.containsKey(packetId)) {
@@ -148,12 +160,13 @@ public void channelRead(ChannelHandlerContext ctx, Object msg) {
148160
}
149161
}
150162
if (currentStage == Stage.AWAIT_DATA) {
151-
if (tmp.readableBytes() >= waitingLength) {
163+
if (packetBuffer.readableBytes() >= waitingLength) {
152164
try {
153165
lastPacketReceived = System.currentTimeMillis();
154166
PacketIn packet = DepenizenBungee.instance.packets.get(packetId);
155-
packet.process(this, tmp);
167+
packet.process(this, packetBuffer);
156168
currentStage = Stage.AWAIT_HEADER;
169+
reallocateBuf(ctx);
157170
}
158171
catch (Throwable ex) {
159172
ex.printStackTrace();

0 commit comments

Comments
 (0)