Repository: qpid-proton Updated Branches: refs/heads/0.9.x adef38209 -> 4c5df774b
PROTON-857: use maps to track handle usage, avoid pre-allocating large arrays we typically wont utilise fully Also reduces handle-max to 65535, giving 65536 usable handles like proton-c currently has. (cherry picked from commit 74e16dfe00f21621e8dbc27cea41ae12ad9a66c7) Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/8a6bc4a0 Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/8a6bc4a0 Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/8a6bc4a0 Branch: refs/heads/0.9.x Commit: 8a6bc4a04b6ebccf6c7ff6f0734baeb5b33ab8f8 Parents: 77c1ee0 Author: Robert Gemmell <[email protected]> Authored: Wed Apr 22 11:22:13 2015 +0100 Committer: Robert Gemmell <[email protected]> Committed: Sat Apr 25 20:24:17 2015 +0100 ---------------------------------------------------------------------- .../proton/engine/impl/TransportSession.java | 50 +++++++++----------- 1 file changed, 22 insertions(+), 28 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/8a6bc4a0/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/TransportSession.java ---------------------------------------------------------------------- diff --git a/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/TransportSession.java b/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/TransportSession.java index fb537cc..1f4a9f8 100644 --- a/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/TransportSession.java +++ b/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/TransportSession.java @@ -34,20 +34,22 @@ import org.apache.qpid.proton.engine.Event; class TransportSession { + private static final int HANDLE_MAX = 65535; + private final TransportImpl _transport; private final SessionImpl _session; private int _localChannel = -1; private int _remoteChannel = -1; private boolean _openSent; - private final UnsignedInteger _handleMax = UnsignedInteger.valueOf(65536); + private final UnsignedInteger _handleMax = UnsignedInteger.valueOf(HANDLE_MAX); //TODO: should this be configurable? private UnsignedInteger _outgoingDeliveryId = UnsignedInteger.ZERO; private UnsignedInteger _incomingWindowSize = UnsignedInteger.ZERO; private UnsignedInteger _outgoingWindowSize = UnsignedInteger.ZERO; private UnsignedInteger _nextOutgoingId = UnsignedInteger.ONE; private UnsignedInteger _nextIncomingId = null; - private final TransportLink[] _remoteHandleMap = new TransportLink[_handleMax.intValue() + 1]; - private final TransportLink[] _localHandleMap = new TransportLink[_handleMax.intValue() + 1]; + private final Map<UnsignedInteger, TransportLink<?>> _remoteHandlesMap = new HashMap<UnsignedInteger, TransportLink<?>>(); + private final Map<UnsignedInteger, TransportLink<?>> _localHandlesMap = new HashMap<UnsignedInteger, TransportLink<?>>(); private final Map<String, TransportLink> _halfOpenLinks = new HashMap<String, TransportLink>(); @@ -138,15 +140,11 @@ class TransportSession private void unsetLocalHandles() { - for(int i = 0; i < _localHandleMap.length; i++) + for (TransportLink<?> tl : _localHandlesMap.values()) { - TransportLink<?> tl = _localHandleMap[i]; - if(tl != null) - { - _localHandleMap[i] = null; - tl.clearLocalHandle(); - } + tl.clearLocalHandle(); } + _localHandlesMap.clear(); } public void unsetRemoteChannel() @@ -160,15 +158,11 @@ class TransportSession private void unsetRemoteHandles() { - for(int i = 0; i < _remoteHandleMap.length; i++) + for (TransportLink<?> tl : _remoteHandlesMap.values()) { - TransportLink<?> tl = _remoteHandleMap[i]; - if(tl != null) - { - _remoteHandleMap[i] = null; - tl.clearRemoteHandle(); - } + tl.clearRemoteHandle(); } + _remoteHandlesMap.clear(); } public UnsignedInteger getHandleMax() @@ -231,19 +225,19 @@ class TransportSession public TransportLink getLinkFromRemoteHandle(UnsignedInteger handle) { - return _remoteHandleMap[handle.intValue()]; + return _remoteHandlesMap.get(handle); } public UnsignedInteger allocateLocalHandle(TransportLink transportLink) { - for(int i = 0; i < _localHandleMap.length; i++) + for(int i = 0; i <= HANDLE_MAX; i++) { - if(_localHandleMap[i] == null) + UnsignedInteger handle = UnsignedInteger.valueOf(i); + if(!_localHandlesMap.containsKey(handle)) { - UnsignedInteger rc = UnsignedInteger.valueOf(i); - _localHandleMap[i] = transportLink; - transportLink.setLocalHandle(rc); - return rc; + _localHandlesMap.put(handle, transportLink); + transportLink.setLocalHandle(handle); + return handle; } } throw new IllegalStateException("no local handle available for allocation"); @@ -251,22 +245,22 @@ class TransportSession public void addLinkRemoteHandle(TransportLink link, UnsignedInteger remoteHandle) { - _remoteHandleMap[remoteHandle.intValue()] = link; + _remoteHandlesMap.put(remoteHandle, link); } public void addLinkLocalHandle(TransportLink link, UnsignedInteger localhandle) { - _localHandleMap[localhandle.intValue()] = link; + _localHandlesMap.put(localhandle, link); } public void freeLocalHandle(UnsignedInteger handle) { - _localHandleMap[handle.intValue()] = null; + _localHandlesMap.remove(handle); } public void freeRemoteHandle(UnsignedInteger handle) { - _remoteHandleMap[handle.intValue()] = null; + _remoteHandlesMap.remove(handle); } public TransportLink resolveHalfOpenLink(String name) --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
