1 /* 2 * Copyright 2016 The Netty Project 3 * 4 * The Netty Project licenses this file to you under the Apache License, 5 * version 2.0 (the "License"); you may not use this file except in compliance 6 * with the License. You may obtain a copy of the License at: 7 * 8 * https://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 * License for the specific language governing permissions and limitations 14 * under the License. 15 */ 16 package io.netty.channel; 17 18 import static io.netty.util.internal.ObjectUtil.checkPositiveOrZero; 19 20 /** 21 * WriteBufferWaterMark is used to set low water mark and high water mark for the write buffer. 22 * <p> 23 * If the number of bytes queued in the write buffer exceeds the 24 * {@linkplain #high high water mark}, {@link Channel#isWritable()} 25 * will start to return {@code false}. 26 * <p> 27 * If the number of bytes queued in the write buffer exceeds the 28 * {@linkplain #high high water mark} and then 29 * dropped down below the {@linkplain #low low water mark}, 30 * {@link Channel#isWritable()} will start to return 31 * {@code true} again. 32 * <p> 33 * Note that messages needs to be handled by the {@link MessageSizeEstimator} 34 * used by the channel for {@link Channel#isWritable()} to provide accurate back-pressure. 35 */ 36 public final class WriteBufferWaterMark { 37 38 private static final int DEFAULT_LOW_WATER_MARK = 32 * 1024; 39 private static final int DEFAULT_HIGH_WATER_MARK = 64 * 1024; 40 41 public static final WriteBufferWaterMark DEFAULT = 42 new WriteBufferWaterMark(DEFAULT_LOW_WATER_MARK, DEFAULT_HIGH_WATER_MARK, false); 43 44 private final int low; 45 private final int high; 46 47 /** 48 * Create a new instance. 49 * 50 * @param low low water mark for write buffer. 51 * @param high high water mark for write buffer 52 */ 53 public WriteBufferWaterMark(int low, int high) { 54 this(low, high, true); 55 } 56 57 /** 58 * This constructor is needed to keep backward-compatibility. 59 */ 60 WriteBufferWaterMark(int low, int high, boolean validate) { 61 if (validate) { 62 checkPositiveOrZero(low, "low"); 63 if (high < low) { 64 throw new IllegalArgumentException( 65 "write buffer's high water mark cannot be less than " + 66 " low water mark (" + low + "): " + 67 high); 68 } 69 } 70 this.low = low; 71 this.high = high; 72 } 73 74 /** 75 * Returns the low water mark for the write buffer. 76 */ 77 public int low() { 78 return low; 79 } 80 81 /** 82 * Returns the high water mark for the write buffer. 83 */ 84 public int high() { 85 return high; 86 } 87 88 @Override 89 public String toString() { 90 StringBuilder builder = new StringBuilder(55) 91 .append("WriteBufferWaterMark(low: ") 92 .append(low) 93 .append(", high: ") 94 .append(high) 95 .append(")"); 96 return builder.toString(); 97 } 98 99 }