You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by jf...@apache.org on 2019/08/08 10:38:18 UTC

[plc4x] 01/01: Iniital Refactoring.

This is an automated email from the ASF dual-hosted git repository.

jfeinauer pushed a commit to branch fix-bytebuff-leaks
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit 3dadbce187a488e27e169eaf280443d7061ce9e9
Author: julian <j....@pragmaticminds.de>
AuthorDate: Thu Aug 8 12:38:03 2019 +0200

    Iniital Refactoring.
---
 .../apache/plc4x/java/base/messages/PlcRawMessage.java   | 16 ++++++++++++++++
 .../plc4x/java/isoontcp/protocol/IsoOnTcpProtocol.java   |  6 ++++++
 2 files changed, 22 insertions(+)

diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/PlcRawMessage.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/PlcRawMessage.java
index b6205d9..bde8e93 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/PlcRawMessage.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/PlcRawMessage.java
@@ -32,9 +32,13 @@ public class PlcRawMessage implements PlcProtocolMessage {
     public PlcRawMessage(ByteBuf userData, PlcProtocolMessage parent) {
         this.userData = userData;
         this.parent = parent;
+        // Retain ByteBuf for Rec Counting
+        this.userData.retain();
     }
 
     public ByteBuf getUserData() {
+        // Increment Ref Count because the client has to free the object also
+        this.userData.retain();
         return userData;
     }
 
@@ -43,4 +47,16 @@ public class PlcRawMessage implements PlcProtocolMessage {
         return parent;
     }
 
+    /**
+     * This method calls the release method of the underlying Netty {@link ByteBuf} and
+     * has to be called when the Message Object is no longer used.
+     *
+     * Otherwise this could lead to a LEAK.
+     *
+     * Important, this should not be called TWICE but exactly ONCE.
+     */
+    public void release() {
+        this.userData.release();
+    }
+
 }
diff --git a/plc4j/protocols/iso-on-tcp/src/main/java/org/apache/plc4x/java/isoontcp/protocol/IsoOnTcpProtocol.java b/plc4j/protocols/iso-on-tcp/src/main/java/org/apache/plc4x/java/isoontcp/protocol/IsoOnTcpProtocol.java
index afd6146..ee375ba 100644
--- a/plc4j/protocols/iso-on-tcp/src/main/java/org/apache/plc4x/java/isoontcp/protocol/IsoOnTcpProtocol.java
+++ b/plc4j/protocols/iso-on-tcp/src/main/java/org/apache/plc4x/java/isoontcp/protocol/IsoOnTcpProtocol.java
@@ -61,6 +61,10 @@ public class IsoOnTcpProtocol extends PlcByteToMessageCodec<IsoOnTcpMessage> {
 
         // Output the payload.
         out.writeBytes(userData);
+
+        // Release the ByteBuf and the IsoOnTcpMessage
+        userData.release();
+        in.release();
     }
 
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -97,8 +101,10 @@ public class IsoOnTcpProtocol extends PlcByteToMessageCodec<IsoOnTcpMessage> {
                 // Skip the 4 bytes we peeked into manually.
                 in.skipBytes(4);
                 // Simply place the current buffer to the output ... the next handler will continue.
+                // TODO we have to free the ByteBuff here (but also propagate that through the object)
                 ByteBuf payload = in.readBytes(packetLength - 4);
                 out.add(new IsoOnTcpMessage(payload));
+                payload.release();
             /*} else {
                 chunkedResponse = Unpooled.buffer(packetLength);
                 chunkedResponse.writeBytes(in, packetLength);*/