diff --git a/transport/src/main/java/io/netty/channel/ChannelOutboundBuffer.java b/transport/src/main/java/io/netty/channel/ChannelOutboundBuffer.java index 8bac293a28..06cd3a3f50 100644 --- a/transport/src/main/java/io/netty/channel/ChannelOutboundBuffer.java +++ b/transport/src/main/java/io/netty/channel/ChannelOutboundBuffer.java @@ -215,16 +215,8 @@ public class ChannelOutboundBuffer { return; } - long oldValue = totalPendingSize; - long newWriteBufferSize = oldValue + size; - while (!TOTAL_PENDING_SIZE_UPDATER.compareAndSet(this, oldValue, newWriteBufferSize)) { - oldValue = totalPendingSize; - newWriteBufferSize = oldValue + size; - } - - int highWaterMark = channel.config().getWriteBufferHighWaterMark(); - - if (newWriteBufferSize > highWaterMark) { + long newWriteBufferSize = TOTAL_PENDING_SIZE_UPDATER.addAndGet(this, size); + if (newWriteBufferSize > channel.config().getWriteBufferHighWaterMark()) { if (WRITABLE_UPDATER.compareAndSet(this, 1, 0)) { channel.pipeline().fireChannelWritabilityChanged(); } @@ -243,16 +235,8 @@ public class ChannelOutboundBuffer { return; } - long oldValue = totalPendingSize; - long newWriteBufferSize = oldValue - size; - while (!TOTAL_PENDING_SIZE_UPDATER.compareAndSet(this, oldValue, newWriteBufferSize)) { - oldValue = totalPendingSize; - newWriteBufferSize = oldValue - size; - } - - int lowWaterMark = channel.config().getWriteBufferLowWaterMark(); - - if (newWriteBufferSize == 0 || newWriteBufferSize < lowWaterMark) { + long newWriteBufferSize = TOTAL_PENDING_SIZE_UPDATER.addAndGet(this, -size); + if (newWriteBufferSize == 0 || newWriteBufferSize < channel.config().getWriteBufferLowWaterMark()) { if (WRITABLE_UPDATER.compareAndSet(this, 0, 1)) { channel.pipeline().fireChannelWritabilityChanged(); } @@ -436,12 +420,7 @@ public class ChannelOutboundBuffer { // Just decrease; do not trigger any events via decrementPendingOutboundBytes() int size = e.pendingSize; - long oldValue = totalPendingSize; - long newWriteBufferSize = oldValue - size; - while (!TOTAL_PENDING_SIZE_UPDATER.compareAndSet(this, oldValue, newWriteBufferSize)) { - oldValue = totalPendingSize; - newWriteBufferSize = oldValue - size; - } + TOTAL_PENDING_SIZE_UPDATER.addAndGet(this, -size); e.pendingSize = 0; if (!e.cancelled) {