PROTON-1756 Reuse callback for send of Transfer frames
Reduce GC pressure by not allocating new Runnables on each call to send
a Transfer into the Frame writer.
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/TransportImpl.java b/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/TransportImpl.java
index 33e4f87..d7fbb10 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/TransportImpl.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/TransportImpl.java
@@ -142,6 +142,8 @@
private List<TransportLayer> _additionalTransportLayers;
+ private final PartialTransferHandler partialTransferHandler = new PartialTransferHandler();
+
/**
* Application code should use {@link org.apache.qpid.proton.engine.Transport.Factory#create()} instead
*/
@@ -590,8 +592,12 @@
ByteBuffer.wrap(delivery.getData(), delivery.getDataOffset(),
delivery.getDataLength());
- writeFrame(tpSession.getLocalChannel(), transfer, payload,
- new PartialTransfer(transfer));
+ try {
+ writeFrame(tpSession.getLocalChannel(), transfer, payload, partialTransferHandler.setTransfer(transfer));
+ } finally {
+ partialTransferHandler.setTransfer(null);
+ }
+
tpSession.incrementOutgoingId();
tpSession.decrementRemoteIncomingWindow();
@@ -1655,13 +1661,14 @@
return "TransportImpl [_connectionEndpoint=" + _connectionEndpoint + ", " + super.toString() + "]";
}
- private static class PartialTransfer implements Runnable
+ private static class PartialTransferHandler implements Runnable
{
- private final Transfer _transfer;
+ private Transfer _transfer;
- public PartialTransfer(Transfer transfer)
+ PartialTransferHandler setTransfer(Transfer transfer)
{
- _transfer = transfer;
+ this._transfer = transfer;
+ return this;
}
@Override