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 }