Repository: mina-sshd Updated Branches: refs/heads/master 4651d235b -> 3c9efa8a5
[SSHD-812] Improve Window performance Do not use an AtomicLong since all accesses are synchronized anyway Project: http://git-wip-us.apache.org/repos/asf/mina-sshd/repo Commit: http://git-wip-us.apache.org/repos/asf/mina-sshd/commit/3c9efa8a Tree: http://git-wip-us.apache.org/repos/asf/mina-sshd/tree/3c9efa8a Diff: http://git-wip-us.apache.org/repos/asf/mina-sshd/diff/3c9efa8a Branch: refs/heads/master Commit: 3c9efa8a53ded17622b0b193e9439eeda7a21218 Parents: 4651d23 Author: Guillaume Nodet <gno...@apache.org> Authored: Tue Apr 10 14:46:04 2018 +0200 Committer: Guillaume Nodet <gno...@apache.org> Committed: Tue Apr 10 15:38:54 2018 +0200 ---------------------------------------------------------------------- .../org/apache/sshd/common/channel/Window.java | 21 ++++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/3c9efa8a/sshd-core/src/main/java/org/apache/sshd/common/channel/Window.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/channel/Window.java b/sshd-core/src/main/java/org/apache/sshd/common/channel/Window.java index a07c045..5eebb4b 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/channel/Window.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/channel/Window.java @@ -24,7 +24,6 @@ import java.net.SocketTimeoutException; import java.util.Objects; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicLong; import java.util.function.Predicate; import org.apache.sshd.common.FactoryManager; @@ -48,16 +47,16 @@ public class Window extends AbstractLoggingBean implements java.nio.channels.Cha */ public static final Predicate<Window> SPACE_AVAILABLE_PREDICATE = input -> { // NOTE: we do not call "getSize()" on purpose in order to avoid the lock - return input.sizeHolder.get() > 0; + return input.size > 0; }; private final AtomicBoolean closed = new AtomicBoolean(false); private final AtomicBoolean initialized = new AtomicBoolean(false); - private final AtomicLong sizeHolder = new AtomicLong(0L); private final AbstractChannel channelInstance; private final Object lock; private final String suffix; + private long size; // the window size private long maxSize; // actually uint32 private long packetSize; // actually uint32 @@ -74,7 +73,7 @@ public class Window extends AbstractLoggingBean implements java.nio.channels.Cha public long getSize() { synchronized (lock) { - return sizeHolder.get(); + return size; } } @@ -132,7 +131,7 @@ public class Window extends AbstractLoggingBean implements java.nio.channels.Cha * of up to 2^32 - 1 bytes. The window MUST NOT be increased above * 2^32 - 1 bytes. */ - expandedSize = sizeHolder.get() + window; + expandedSize = size + window; if (expandedSize > BufferUtils.MAX_UINT32_VALUE) { updateSize(BufferUtils.MAX_UINT32_VALUE); } else { @@ -153,7 +152,7 @@ public class Window extends AbstractLoggingBean implements java.nio.channels.Cha long remainLen; synchronized (lock) { - remainLen = sizeHolder.get() - len; + remainLen = size - len; if (remainLen >= 0L) { updateSize(remainLen); } @@ -190,7 +189,7 @@ public class Window extends AbstractLoggingBean implements java.nio.channels.Cha AbstractChannel channel = getChannel(); synchronized (lock) { // TODO make the adjust factor configurable via FactoryManager property - long size = sizeHolder.get(); + long size = this.size; if (size < (maxFree / 2)) { adjustSize = maxFree - size; channel.sendWindowAdjust(adjustSize); @@ -224,11 +223,11 @@ public class Window extends AbstractLoggingBean implements java.nio.channels.Cha synchronized (lock) { waitForCondition(input -> { // NOTE: we do not call "getSize()" on purpose in order to avoid the lock - return input.sizeHolder.get() >= len; + return input.size >= len; }, maxWaitTime); if (debugEnabled) { - log.debug("waitAndConsume({}) - requested={}, available={}", this, len, sizeHolder); + log.debug("waitAndConsume({}) - requested={}, available={}", this, len, size); } consume(len); @@ -251,7 +250,7 @@ public class Window extends AbstractLoggingBean implements java.nio.channels.Cha long available; synchronized (lock) { waitForCondition(SPACE_AVAILABLE_PREDICATE, maxWaitTime); - available = sizeHolder.get(); + available = size; } if (log.isDebugEnabled()) { @@ -308,7 +307,7 @@ public class Window extends AbstractLoggingBean implements java.nio.channels.Cha protected void updateSize(long size) { BufferUtils.validateUint32Value(size, "Invalid updated size: %d", size); - this.sizeHolder.set(size); + this.size = size; lock.notifyAll(); }