1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package io.netty.channel;
17
18 import io.netty.util.internal.AdaptiveCalculator;
19
20 import static io.netty.util.internal.ObjectUtil.checkPositive;
21
22
23
24
25
26
27
28
29
30
31
32 public class AdaptiveRecvByteBufAllocator extends DefaultMaxMessagesRecvByteBufAllocator {
33
34 public static final int DEFAULT_MINIMUM = 64;
35
36 public static final int DEFAULT_INITIAL = 2048;
37 public static final int DEFAULT_MAXIMUM = 65536;
38
39
40
41
42 @Deprecated
43 public static final AdaptiveRecvByteBufAllocator DEFAULT = new AdaptiveRecvByteBufAllocator();
44
45 private final class HandleImpl extends MaxMessageHandle {
46 private final AdaptiveCalculator calculator;
47
48 HandleImpl(int minimum, int initial, int maximum) {
49 calculator = new AdaptiveCalculator(minimum, initial, maximum);
50 }
51
52 @Override
53 public void lastBytesRead(int bytes) {
54
55
56
57
58 if (bytes == attemptedBytesRead()) {
59 calculator.record(bytes);
60 }
61 super.lastBytesRead(bytes);
62 }
63
64 @Override
65 public int guess() {
66 return calculator.nextSize();
67 }
68
69 @Override
70 public void readComplete() {
71 calculator.record(totalBytesRead());
72 }
73 }
74
75 private final int minimum;
76 private final int initial;
77 private final int maximum;
78
79
80
81
82
83
84 public AdaptiveRecvByteBufAllocator() {
85 this(DEFAULT_MINIMUM, DEFAULT_INITIAL, DEFAULT_MAXIMUM);
86 }
87
88
89
90
91
92
93
94
95 public AdaptiveRecvByteBufAllocator(int minimum, int initial, int maximum) {
96 checkPositive(minimum, "minimum");
97 if (initial < minimum) {
98 throw new IllegalArgumentException("initial: " + initial);
99 }
100 if (maximum < initial) {
101 throw new IllegalArgumentException("maximum: " + maximum);
102 }
103
104 this.minimum = minimum;
105 this.initial = initial;
106 this.maximum = maximum;
107 }
108
109 @SuppressWarnings("deprecation")
110 @Override
111 public Handle newHandle() {
112 return new HandleImpl(minimum, initial, maximum);
113 }
114
115 @Override
116 public AdaptiveRecvByteBufAllocator respectMaybeMoreData(boolean respectMaybeMoreData) {
117 super.respectMaybeMoreData(respectMaybeMoreData);
118 return this;
119 }
120 }