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  *   http://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  */

33 public final class WriteBufferWaterMark {
34
35     private static final int DEFAULT_LOW_WATER_MARK = 32 * 1024;
36     private static final int DEFAULT_HIGH_WATER_MARK = 64 * 1024;
37
38     public static final WriteBufferWaterMark DEFAULT =
39             new WriteBufferWaterMark(DEFAULT_LOW_WATER_MARK, DEFAULT_HIGH_WATER_MARK, false);
40
41     private final int low;
42     private final int high;
43
44     /**
45      * Create a new instance.
46      *
47      * @param low low water mark for write buffer.
48      * @param high high water mark for write buffer
49      */

50     public WriteBufferWaterMark(int low, int high) {
51         this(low, high, true);
52     }
53
54     /**
55      * This constructor is needed to keep backward-compatibility.
56      */

57     WriteBufferWaterMark(int low, int high, boolean validate) {
58         if (validate) {
59             checkPositiveOrZero(low, "low");
60             if (high < low) {
61                 throw new IllegalArgumentException(
62                         "write buffer's high water mark cannot be less than " +
63                                 " low water mark (" + low + "): " +
64                                 high);
65             }
66         }
67         this.low = low;
68         this.high = high;
69     }
70
71     /**
72      * Returns the low water mark for the write buffer.
73      */

74     public int low() {
75         return low;
76     }
77
78     /**
79      * Returns the high water mark for the write buffer.
80      */

81     public int high() {
82         return high;
83     }
84
85     @Override
86     public String toString() {
87         StringBuilder builder = new StringBuilder(55)
88             .append("WriteBufferWaterMark(low: ")
89             .append(low)
90             .append(", high: ")
91             .append(high)
92             .append(")");
93         return builder.toString();
94     }
95
96 }
97