1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.jboss.netty.channel.socket.nio;
17
18 import java.net.DatagramSocket;
19 import java.util.Map;
20
21 import org.jboss.netty.channel.socket.DefaultDatagramChannelConfig;
22 import org.jboss.netty.logging.InternalLogger;
23 import org.jboss.netty.logging.InternalLoggerFactory;
24 import org.jboss.netty.util.internal.ConversionUtil;
25
26
27
28
29
30
31
32
33
34
35
36 class DefaultNioDatagramChannelConfig extends DefaultDatagramChannelConfig
37 implements NioDatagramChannelConfig {
38
39 private static final InternalLogger logger =
40 InternalLoggerFactory
41 .getInstance(DefaultNioDatagramChannelConfig.class);
42
43 private volatile int writeBufferHighWaterMark = 64 * 1024;
44 private volatile int writeBufferLowWaterMark = 32 * 1024;
45 private volatile int writeSpinCount = 16;
46
47 DefaultNioDatagramChannelConfig(DatagramSocket socket) {
48 super(socket);
49 }
50
51 @Override
52 public void setOptions(Map<String, Object> options) {
53 super.setOptions(options);
54 if (getWriteBufferHighWaterMark() < getWriteBufferLowWaterMark()) {
55
56 setWriteBufferLowWaterMark0(getWriteBufferHighWaterMark() >>> 1);
57
58 logger.warn("writeBufferLowWaterMark cannot be greater than "
59 + "writeBufferHighWaterMark; setting to the half of the "
60 + "writeBufferHighWaterMark.");
61 }
62 }
63
64 @Override
65 public boolean setOption(String key, Object value) {
66 if (super.setOption(key, value)) {
67 return true;
68 }
69
70 if (key.equals("writeBufferHighWaterMark")) {
71 setWriteBufferHighWaterMark0(ConversionUtil.toInt(value));
72 } else if (key.equals("writeBufferLowWaterMark")) {
73 setWriteBufferLowWaterMark0(ConversionUtil.toInt(value));
74 } else if (key.equals("writeSpinCount")) {
75 setWriteSpinCount(ConversionUtil.toInt(value));
76 } else {
77 return false;
78 }
79 return true;
80 }
81
82 public int getWriteBufferHighWaterMark() {
83 return writeBufferHighWaterMark;
84 }
85
86 public void setWriteBufferHighWaterMark(int writeBufferHighWaterMark) {
87 if (writeBufferHighWaterMark < getWriteBufferLowWaterMark()) {
88 throw new IllegalArgumentException(
89 "writeBufferHighWaterMark cannot be less than " +
90 "writeBufferLowWaterMark (" +
91 getWriteBufferLowWaterMark() + "): " +
92 writeBufferHighWaterMark);
93 }
94 setWriteBufferHighWaterMark0(writeBufferHighWaterMark);
95 }
96
97 private void setWriteBufferHighWaterMark0(int writeBufferHighWaterMark) {
98 if (writeBufferHighWaterMark < 0) {
99 throw new IllegalArgumentException("writeBufferHighWaterMark: " +
100 writeBufferHighWaterMark);
101 }
102 this.writeBufferHighWaterMark = writeBufferHighWaterMark;
103 }
104
105 public int getWriteBufferLowWaterMark() {
106 return writeBufferLowWaterMark;
107 }
108
109 public void setWriteBufferLowWaterMark(int writeBufferLowWaterMark) {
110 if (writeBufferLowWaterMark > getWriteBufferHighWaterMark()) {
111 throw new IllegalArgumentException(
112 "writeBufferLowWaterMark cannot be greater than " +
113 "writeBufferHighWaterMark (" +
114 getWriteBufferHighWaterMark() + "): " +
115 writeBufferLowWaterMark);
116 }
117 setWriteBufferLowWaterMark0(writeBufferLowWaterMark);
118 }
119
120 private void setWriteBufferLowWaterMark0(int writeBufferLowWaterMark) {
121 if (writeBufferLowWaterMark < 0) {
122 throw new IllegalArgumentException("writeBufferLowWaterMark: " +
123 writeBufferLowWaterMark);
124 }
125 this.writeBufferLowWaterMark = writeBufferLowWaterMark;
126 }
127
128 public int getWriteSpinCount() {
129 return writeSpinCount;
130 }
131
132 public void setWriteSpinCount(int writeSpinCount) {
133 if (writeSpinCount <= 0) {
134 throw new IllegalArgumentException(
135 "writeSpinCount must be a positive integer.");
136 }
137 this.writeSpinCount = writeSpinCount;
138 }
139 }