From 9b4d656503d144131ad8de64fc7241e0785dc2b2 Mon Sep 17 00:00:00 2001 From: Robert Gemmell Date: Thu, 17 Feb 2011 16:16:31 +0000 Subject: QPID-3028: make assembler and disassembler use a static ThreadLocal for its BBEncoder and BBDecoder, release buffer from BBDecoder when complete git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@1071674 13f79535-47bb-0310-9956-ffa450edef68 --- .../main/java/org/apache/qpid/transport/codec/BBDecoder.java | 5 +++++ .../main/java/org/apache/qpid/transport/network/Assembler.java | 10 +++++----- .../java/org/apache/qpid/transport/network/Disassembler.java | 4 ++-- 3 files changed, 12 insertions(+), 7 deletions(-) (limited to 'java') diff --git a/java/common/src/main/java/org/apache/qpid/transport/codec/BBDecoder.java b/java/common/src/main/java/org/apache/qpid/transport/codec/BBDecoder.java index 6f7a2fa3b2..10f67e1cd6 100644 --- a/java/common/src/main/java/org/apache/qpid/transport/codec/BBDecoder.java +++ b/java/common/src/main/java/org/apache/qpid/transport/codec/BBDecoder.java @@ -41,6 +41,11 @@ public final class BBDecoder extends AbstractDecoder this.in.order(ByteOrder.BIG_ENDIAN); } + public void releaseBuffer() + { + in = null; + } + protected byte doGet() { return in.get(); diff --git a/java/common/src/main/java/org/apache/qpid/transport/network/Assembler.java b/java/common/src/main/java/org/apache/qpid/transport/network/Assembler.java index 357caa26e1..b3c419959c 100644 --- a/java/common/src/main/java/org/apache/qpid/transport/network/Assembler.java +++ b/java/common/src/main/java/org/apache/qpid/transport/network/Assembler.java @@ -28,7 +28,6 @@ import java.util.Map; import java.nio.ByteBuffer; import org.apache.qpid.transport.codec.BBDecoder; -import org.apache.qpid.transport.codec.Decoder; import org.apache.qpid.transport.Header; import org.apache.qpid.transport.Method; @@ -36,7 +35,6 @@ import org.apache.qpid.transport.ProtocolError; import org.apache.qpid.transport.ProtocolEvent; import org.apache.qpid.transport.ProtocolHeader; import org.apache.qpid.transport.Receiver; -import org.apache.qpid.transport.SegmentType; import org.apache.qpid.transport.Struct; @@ -51,7 +49,7 @@ public class Assembler implements Receiver, NetworkDelegate private final Receiver receiver; private final Map> segments; private final Method[] incomplete; - private final ThreadLocal decoder = new ThreadLocal() + private static final ThreadLocal _decoder = new ThreadLocal() { public BBDecoder initialValue() { @@ -169,7 +167,7 @@ public class Assembler implements Receiver, NetworkDelegate private void assemble(Frame frame, ByteBuffer segment) { - BBDecoder dec = decoder.get(); + BBDecoder dec = _decoder.get(); dec.init(segment); int channel = frame.getChannel(); @@ -201,7 +199,7 @@ public class Assembler implements Receiver, NetworkDelegate break; case HEADER: command = incomplete[channel]; - List structs = new ArrayList(2); + List structs = new ArrayList(2); while (dec.hasRemaining()) { structs.add(dec.readStruct32()); @@ -222,6 +220,8 @@ public class Assembler implements Receiver, NetworkDelegate default: throw new IllegalStateException("unknown frame type: " + frame.getType()); } + + dec.releaseBuffer(); } } diff --git a/java/common/src/main/java/org/apache/qpid/transport/network/Disassembler.java b/java/common/src/main/java/org/apache/qpid/transport/network/Disassembler.java index bf439299b9..341264c347 100644 --- a/java/common/src/main/java/org/apache/qpid/transport/network/Disassembler.java +++ b/java/common/src/main/java/org/apache/qpid/transport/network/Disassembler.java @@ -54,7 +54,7 @@ public final class Disassembler implements Sender, private final int maxPayload; private final ByteBuffer header; private final Object sendlock = new Object(); - private final ThreadLocal encoder = new ThreadLocal() + private final static ThreadLocal _encoder = new ThreadLocal() { public BBEncoder initialValue() { @@ -183,7 +183,7 @@ public final class Disassembler implements Sender, private void method(Method method, SegmentType type) { - BBEncoder enc = encoder.get(); + BBEncoder enc = _encoder.get(); enc.init(); enc.writeUint16(method.getEncodedType()); if (type == SegmentType.COMMAND) -- cgit v1.2.1