Channel writable bytes feature
Motivation: To avoid buffering too much it would be useful to get an estimate of how many bytes can be written to a Channel before it becomes unwritable. Modifications: - Update the Channel interface to support 2 new methods. 1 to give how many bytes before unwritable. 1 to give how many bytes before writable. - Update the AbstractChannel implementation to delegate to the ChannelOutboundBuffer. Result: The Channel interface supports 2 new methods which provide more visibility into writability.
This commit is contained in:
parent
caa1505020
commit
09d826ed46
@ -107,6 +107,22 @@ public abstract class AbstractChannel extends DefaultAttributeMap implements Cha
|
|||||||
return buf != null && buf.isWritable();
|
return buf != null && buf.isWritable();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long bytesBeforeUnwritable() {
|
||||||
|
ChannelOutboundBuffer buf = unsafe.outboundBuffer();
|
||||||
|
// isWritable() is currently assuming if there is no outboundBuffer then the channel is not writable.
|
||||||
|
// We should be consistent with that here.
|
||||||
|
return buf != null ? buf.bytesBeforeUnwritable() : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long bytesBeforeWritable() {
|
||||||
|
ChannelOutboundBuffer buf = unsafe.outboundBuffer();
|
||||||
|
// isWritable() is currently assuming if there is no outboundBuffer then the channel is not writable.
|
||||||
|
// We should be consistent with that here.
|
||||||
|
return buf != null ? buf.bytesBeforeWritable() : Long.MAX_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Channel parent() {
|
public Channel parent() {
|
||||||
return parent;
|
return parent;
|
||||||
|
@ -163,6 +163,18 @@ public interface Channel extends AttributeMap, Comparable<Channel> {
|
|||||||
*/
|
*/
|
||||||
boolean isWritable();
|
boolean isWritable();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get how many bytes can be written until {@link #isWritable()} returns {@code false}.
|
||||||
|
* This quantity will always be non-negative. If {@link #isWritable()} is {@code false} then 0.
|
||||||
|
*/
|
||||||
|
long bytesBeforeUnwritable();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get how many bytes must be drained from underlying buffers until {@link #isWritable()} returns {@code true}.
|
||||||
|
* This quantity will always be non-negative. If {@link #isWritable()} is {@code true} then 0.
|
||||||
|
*/
|
||||||
|
long bytesBeforeWritable();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns an <em>internal-use-only</em> object that provides unsafe operations.
|
* Returns an <em>internal-use-only</em> object that provides unsafe operations.
|
||||||
*/
|
*/
|
||||||
|
@ -693,7 +693,7 @@ public final class ChannelOutboundBuffer {
|
|||||||
* Get how many bytes can be written until {@link #isWritable()} returns {@code false}.
|
* Get how many bytes can be written until {@link #isWritable()} returns {@code false}.
|
||||||
* This quantity will always be non-negative. If {@link #isWritable()} is {@code false} then 0.
|
* This quantity will always be non-negative. If {@link #isWritable()} is {@code false} then 0.
|
||||||
*/
|
*/
|
||||||
public long bytesBeforeUnWritable() {
|
public long bytesBeforeUnwritable() {
|
||||||
long bytes = channel.config().getWriteBufferHighWaterMark() - totalPendingSize;
|
long bytes = channel.config().getWriteBufferHighWaterMark() - totalPendingSize;
|
||||||
// If bytes is negative we know we are not writable, but if bytes is non-negative we have to check writability.
|
// If bytes is negative we know we are not writable, but if bytes is non-negative we have to check writability.
|
||||||
// Note that totalPendingSize and isWritable() use different volatile variables that are not synchronized
|
// Note that totalPendingSize and isWritable() use different volatile variables that are not synchronized
|
||||||
|
Loading…
Reference in New Issue
Block a user