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();
|
||||
}
|
||||
|
||||
@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
|
||||
public Channel parent() {
|
||||
return parent;
|
||||
|
@ -163,6 +163,18 @@ public interface Channel extends AttributeMap, Comparable<Channel> {
|
||||
*/
|
||||
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.
|
||||
*/
|
||||
|
@ -693,7 +693,7 @@ public final class ChannelOutboundBuffer {
|
||||
* 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.
|
||||
*/
|
||||
public long bytesBeforeUnWritable() {
|
||||
public long bytesBeforeUnwritable() {
|
||||
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.
|
||||
// Note that totalPendingSize and isWritable() use different volatile variables that are not synchronized
|
||||
|
Loading…
Reference in New Issue
Block a user