Reduce exception instantiation overhead in SslHandler / Reduce unnecessary empty array creation
- Added EmptyArrays as an internal utility class
This commit is contained in:
parent
c95796d981
commit
b5989e2449
@ -16,6 +16,7 @@
|
||||
package io.netty.buffer;
|
||||
|
||||
import io.netty.util.ResourceLeak;
|
||||
import io.netty.util.internal.EmptyArrays;
|
||||
import io.netty.util.internal.PlatformDependent;
|
||||
|
||||
import java.io.IOException;
|
||||
@ -42,8 +43,6 @@ import java.util.Queue;
|
||||
*/
|
||||
public class DefaultCompositeByteBuf extends AbstractReferenceCountedByteBuf implements CompositeByteBuf {
|
||||
|
||||
private static final ByteBuffer[] EMPTY_NIOBUFFERS = new ByteBuffer[0];
|
||||
|
||||
private final ResourceLeak leak;
|
||||
private final ByteBufAllocator alloc;
|
||||
private final boolean direct;
|
||||
@ -1049,7 +1048,7 @@ public class DefaultCompositeByteBuf extends AbstractReferenceCountedByteBuf imp
|
||||
public ByteBuffer[] nioBuffers(int index, int length) {
|
||||
checkIndex(index, length);
|
||||
if (length == 0) {
|
||||
return EMPTY_NIOBUFFERS;
|
||||
return EmptyArrays.EMPTY_BYTE_BUFFERS;
|
||||
}
|
||||
|
||||
List<ByteBuffer> buffers = new ArrayList<ByteBuffer>(components.size());
|
||||
|
@ -16,6 +16,7 @@
|
||||
|
||||
package io.netty.buffer;
|
||||
|
||||
import io.netty.util.internal.EmptyArrays;
|
||||
import io.netty.util.internal.PlatformDependent;
|
||||
|
||||
import java.io.InputStream;
|
||||
@ -32,7 +33,6 @@ import java.nio.charset.Charset;
|
||||
*/
|
||||
public final class EmptyByteBuf implements ByteBuf {
|
||||
|
||||
private static final byte[] EMPTY_ARRAY = new byte[0];
|
||||
private static final ByteBuffer EMPTY_BYTE_BUFFER = ByteBuffer.allocateDirect(0);
|
||||
private static final long EMPTY_BYTE_BUFFER_ADDRESS;
|
||||
|
||||
@ -767,7 +767,7 @@ public final class EmptyByteBuf implements ByteBuf {
|
||||
|
||||
@Override
|
||||
public byte[] array() {
|
||||
return EMPTY_ARRAY;
|
||||
return EmptyArrays.EMPTY_BYTES;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -32,6 +32,7 @@ import java.util.Random;
|
||||
import java.util.Set;
|
||||
|
||||
import static io.netty.buffer.Unpooled.*;
|
||||
import static io.netty.util.internal.EmptyArrays.*;
|
||||
import static org.hamcrest.CoreMatchers.*;
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
@ -42,7 +43,6 @@ public abstract class AbstractByteBufTest {
|
||||
|
||||
private static final int CAPACITY = 4096; // Must be even
|
||||
private static final int BLOCK_SIZE = 128;
|
||||
private static final byte[] EMPTY_ARRAY = new byte[0];
|
||||
|
||||
private static final Queue<ByteBuf> freeLaterQueue = new ArrayDeque<ByteBuf>();
|
||||
|
||||
@ -235,12 +235,12 @@ public abstract class AbstractByteBufTest {
|
||||
|
||||
@Test(expected = IndexOutOfBoundsException.class)
|
||||
public void getByteArrayBoundaryCheck1() {
|
||||
buffer.getBytes(-1, EMPTY_ARRAY);
|
||||
buffer.getBytes(-1, EMPTY_BYTES);
|
||||
}
|
||||
|
||||
@Test(expected = IndexOutOfBoundsException.class)
|
||||
public void getByteArrayBoundaryCheck2() {
|
||||
buffer.getBytes(-1, EMPTY_ARRAY, 0, 0);
|
||||
buffer.getBytes(-1, EMPTY_BYTES, 0, 0);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -24,13 +24,13 @@ import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import static io.netty.buffer.Unpooled.*;
|
||||
import static io.netty.util.internal.EmptyArrays.*;
|
||||
import static org.hamcrest.CoreMatchers.*;
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
/**
|
||||
* An abstract test class for composite channel buffers
|
||||
*/
|
||||
@SuppressWarnings("ZeroLengthArrayAllocation")
|
||||
public abstract class AbstractCompositeByteBufTest extends AbstractByteBufTest {
|
||||
|
||||
private final ByteOrder order;
|
||||
@ -418,7 +418,7 @@ public abstract class AbstractCompositeByteBufTest extends AbstractByteBufTest {
|
||||
public void testEmptyBuffer() {
|
||||
ByteBuf b = freeLater(wrappedBuffer(new byte[]{1, 2}, new byte[]{3, 4}));
|
||||
b.readBytes(new byte[4]);
|
||||
b.readBytes(new byte[0]);
|
||||
b.readBytes(EMPTY_BYTES);
|
||||
}
|
||||
|
||||
// Test for https://github.com/netty/netty/issues/1060
|
||||
|
@ -20,12 +20,12 @@ import org.junit.Test;
|
||||
import java.io.EOFException;
|
||||
import java.nio.charset.Charset;
|
||||
|
||||
import static io.netty.util.internal.EmptyArrays.*;
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
/**
|
||||
* Tests channel buffer streams
|
||||
*/
|
||||
@SuppressWarnings("ZeroLengthArrayAllocation")
|
||||
public class ByteBufStreamTest {
|
||||
|
||||
@Test
|
||||
@ -56,7 +56,7 @@ public class ByteBufStreamTest {
|
||||
out.writeShort(49152);
|
||||
out.writeUTF("Hello, World!");
|
||||
out.writeBytes("The first line\r\r\n");
|
||||
out.write(new byte[0]);
|
||||
out.write(EMPTY_BYTES);
|
||||
out.write(new byte[] { 1, 2, 3, 4 });
|
||||
out.write(new byte[] { 1, 3, 3, 4 }, 0, 0);
|
||||
out.close();
|
||||
|
@ -31,14 +31,17 @@ import java.util.Map.Entry;
|
||||
import java.util.Queue;
|
||||
|
||||
import static io.netty.buffer.Unpooled.*;
|
||||
import static io.netty.util.internal.EmptyArrays.*;
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
/**
|
||||
* Tests channel buffers
|
||||
*/
|
||||
@SuppressWarnings("ZeroLengthArrayAllocation")
|
||||
public class UnpooledTest {
|
||||
|
||||
private static final ByteBuf[] EMPTY_BYTE_BUFS = new ByteBuf[0];
|
||||
private static final byte[][] EMPTY_BYTES_2D = new byte[0][];
|
||||
|
||||
private static final Queue<ByteBuf> freeLaterQueue = new ArrayDeque<ByteBuf>();
|
||||
|
||||
protected ByteBuf freeLater(ByteBuf buf) {
|
||||
@ -82,7 +85,7 @@ public class UnpooledTest {
|
||||
@Test
|
||||
public void testHashCode() {
|
||||
Map<byte[], Integer> map = new LinkedHashMap<byte[], Integer>();
|
||||
map.put(new byte[0], 1);
|
||||
map.put(EMPTY_BYTES, 1);
|
||||
map.put(new byte[] { 1 }, 32);
|
||||
map.put(new byte[] { 2 }, 33);
|
||||
map.put(new byte[] { 0, 1 }, 962);
|
||||
@ -183,31 +186,31 @@ public class UnpooledTest {
|
||||
|
||||
@Test
|
||||
public void shouldReturnEmptyBufferWhenLengthIsZero() {
|
||||
assertSame(EMPTY_BUFFER, wrappedBuffer(new byte[0]));
|
||||
assertSame(EMPTY_BUFFER, wrappedBuffer(EMPTY_BYTES));
|
||||
assertSame(EMPTY_BUFFER, wrappedBuffer(new byte[8], 0, 0));
|
||||
assertSame(EMPTY_BUFFER, wrappedBuffer(new byte[8], 8, 0));
|
||||
assertSame(EMPTY_BUFFER, wrappedBuffer(ByteBuffer.allocateDirect(0)));
|
||||
assertSame(EMPTY_BUFFER, wrappedBuffer(EMPTY_BUFFER));
|
||||
assertSame(EMPTY_BUFFER, wrappedBuffer(new byte[0][]));
|
||||
assertSame(EMPTY_BUFFER, wrappedBuffer(new byte[][] { new byte[0] }));
|
||||
assertSame(EMPTY_BUFFER, wrappedBuffer(new ByteBuffer[0]));
|
||||
assertSame(EMPTY_BUFFER, wrappedBuffer(EMPTY_BYTES_2D));
|
||||
assertSame(EMPTY_BUFFER, wrappedBuffer(new byte[][] { EMPTY_BYTES }));
|
||||
assertSame(EMPTY_BUFFER, wrappedBuffer(EMPTY_BYTE_BUFFERS));
|
||||
assertSame(EMPTY_BUFFER, wrappedBuffer(new ByteBuffer[] { ByteBuffer.allocate(0) }));
|
||||
assertSame(EMPTY_BUFFER, wrappedBuffer(ByteBuffer.allocate(0), ByteBuffer.allocate(0)));
|
||||
assertSame(EMPTY_BUFFER, wrappedBuffer(new ByteBuf[0]));
|
||||
assertSame(EMPTY_BUFFER, wrappedBuffer(EMPTY_BYTE_BUFS));
|
||||
assertSame(EMPTY_BUFFER, wrappedBuffer(new ByteBuf[] { buffer(0) }));
|
||||
assertSame(EMPTY_BUFFER, wrappedBuffer(buffer(0), buffer(0)));
|
||||
|
||||
assertSame(EMPTY_BUFFER, copiedBuffer(new byte[0]));
|
||||
assertSame(EMPTY_BUFFER, copiedBuffer(EMPTY_BYTES));
|
||||
assertSame(EMPTY_BUFFER, copiedBuffer(new byte[8], 0, 0));
|
||||
assertSame(EMPTY_BUFFER, copiedBuffer(new byte[8], 8, 0));
|
||||
assertSame(EMPTY_BUFFER, copiedBuffer(ByteBuffer.allocateDirect(0)));
|
||||
assertSame(EMPTY_BUFFER, copiedBuffer(EMPTY_BUFFER));
|
||||
assertSame(EMPTY_BUFFER, copiedBuffer(new byte[0][]));
|
||||
assertSame(EMPTY_BUFFER, copiedBuffer(new byte[][] { new byte[0] }));
|
||||
assertSame(EMPTY_BUFFER, copiedBuffer(new ByteBuffer[0]));
|
||||
assertSame(EMPTY_BUFFER, copiedBuffer(EMPTY_BYTES_2D));
|
||||
assertSame(EMPTY_BUFFER, copiedBuffer(new byte[][] { EMPTY_BYTES }));
|
||||
assertSame(EMPTY_BUFFER, copiedBuffer(EMPTY_BYTE_BUFFERS));
|
||||
assertSame(EMPTY_BUFFER, copiedBuffer(new ByteBuffer[] { ByteBuffer.allocate(0) }));
|
||||
assertSame(EMPTY_BUFFER, copiedBuffer(ByteBuffer.allocate(0), ByteBuffer.allocate(0)));
|
||||
assertSame(EMPTY_BUFFER, copiedBuffer(new ByteBuf[0]));
|
||||
assertSame(EMPTY_BUFFER, copiedBuffer(EMPTY_BYTE_BUFS));
|
||||
assertSame(EMPTY_BUFFER, copiedBuffer(new ByteBuf[] { buffer(0) }));
|
||||
assertSame(EMPTY_BUFFER, copiedBuffer(buffer(0), buffer(0)));
|
||||
}
|
||||
@ -370,7 +373,7 @@ public class UnpooledTest {
|
||||
}
|
||||
|
||||
try {
|
||||
buf.setBytes(0, new byte[0], 0, 0);
|
||||
buf.setBytes(0, EMPTY_BYTES, 0, 0);
|
||||
fail();
|
||||
} catch (UnsupportedOperationException e) {
|
||||
// Expected
|
||||
@ -443,7 +446,7 @@ public class UnpooledTest {
|
||||
assertFalse(buffer.isReadable());
|
||||
|
||||
assertEquals(0, Unpooled.copyInt(null).capacity());
|
||||
assertEquals(0, Unpooled.copyInt(new int[0]).capacity());
|
||||
assertEquals(0, Unpooled.copyInt(EMPTY_INTS).capacity());
|
||||
}
|
||||
|
||||
@Test
|
||||
@ -463,7 +466,7 @@ public class UnpooledTest {
|
||||
assertFalse(buffer.isReadable());
|
||||
|
||||
assertEquals(0, Unpooled.copyShort((short[]) null).capacity());
|
||||
assertEquals(0, Unpooled.copyShort(new short[0]).capacity());
|
||||
assertEquals(0, Unpooled.copyShort(EMPTY_SHORTS).capacity());
|
||||
}
|
||||
|
||||
@Test
|
||||
@ -475,7 +478,7 @@ public class UnpooledTest {
|
||||
assertFalse(buffer.isReadable());
|
||||
|
||||
assertEquals(0, Unpooled.copyShort((int[]) null).capacity());
|
||||
assertEquals(0, Unpooled.copyShort(new int[0]).capacity());
|
||||
assertEquals(0, Unpooled.copyShort(EMPTY_INTS).capacity());
|
||||
}
|
||||
|
||||
@Test
|
||||
@ -495,7 +498,7 @@ public class UnpooledTest {
|
||||
assertFalse(buffer.isReadable());
|
||||
|
||||
assertEquals(0, Unpooled.copyMedium(null).capacity());
|
||||
assertEquals(0, Unpooled.copyMedium(new int[0]).capacity());
|
||||
assertEquals(0, Unpooled.copyMedium(EMPTY_INTS).capacity());
|
||||
}
|
||||
|
||||
@Test
|
||||
@ -515,7 +518,7 @@ public class UnpooledTest {
|
||||
assertFalse(buffer.isReadable());
|
||||
|
||||
assertEquals(0, Unpooled.copyLong(null).capacity());
|
||||
assertEquals(0, Unpooled.copyLong(new long[0]).capacity());
|
||||
assertEquals(0, Unpooled.copyLong(EMPTY_LONGS).capacity());
|
||||
}
|
||||
|
||||
@Test
|
||||
@ -535,7 +538,7 @@ public class UnpooledTest {
|
||||
assertFalse(buffer.isReadable());
|
||||
|
||||
assertEquals(0, Unpooled.copyFloat(null).capacity());
|
||||
assertEquals(0, Unpooled.copyFloat(new float[0]).capacity());
|
||||
assertEquals(0, Unpooled.copyFloat(EMPTY_FLOATS).capacity());
|
||||
}
|
||||
|
||||
@Test
|
||||
@ -555,7 +558,7 @@ public class UnpooledTest {
|
||||
assertFalse(buffer.isReadable());
|
||||
|
||||
assertEquals(0, Unpooled.copyDouble(null).capacity());
|
||||
assertEquals(0, Unpooled.copyDouble(new double[0]).capacity());
|
||||
assertEquals(0, Unpooled.copyDouble(EMPTY_DOUBLES).capacity());
|
||||
}
|
||||
|
||||
@Test
|
||||
@ -567,7 +570,7 @@ public class UnpooledTest {
|
||||
assertFalse(buffer.isReadable());
|
||||
|
||||
assertEquals(0, Unpooled.copyBoolean(null).capacity());
|
||||
assertEquals(0, Unpooled.copyBoolean(new boolean[0]).capacity());
|
||||
assertEquals(0, Unpooled.copyBoolean(EMPTY_BOOLEANS).capacity());
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -17,6 +17,7 @@ package io.netty.handler.codec.http.multipart;
|
||||
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import io.netty.handler.codec.http.HttpConstants;
|
||||
import io.netty.util.internal.EmptyArrays;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
@ -222,7 +223,7 @@ public abstract class AbstractDiskHttpData extends AbstractHttpData {
|
||||
@Override
|
||||
public byte[] get() throws IOException {
|
||||
if (file == null) {
|
||||
return new byte[0];
|
||||
return EmptyArrays.EMPTY_BYTES;
|
||||
}
|
||||
return readFrom(file);
|
||||
}
|
||||
|
@ -18,14 +18,13 @@ package io.netty.handler.codec.http.websocketx;
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import io.netty.buffer.Unpooled;
|
||||
import io.netty.util.CharsetUtil;
|
||||
import io.netty.util.internal.EmptyArrays;
|
||||
|
||||
/**
|
||||
* Web Socket Frame for closing the connection
|
||||
*/
|
||||
public class CloseWebSocketFrame extends WebSocketFrame {
|
||||
|
||||
private static final byte[] EMTPY_REASON = new byte[0];
|
||||
|
||||
/**
|
||||
* Creates a new empty close frame.
|
||||
*/
|
||||
@ -76,7 +75,7 @@ public class CloseWebSocketFrame extends WebSocketFrame {
|
||||
}
|
||||
|
||||
private static ByteBuf newBinaryData(int statusCode, String reasonText) {
|
||||
byte[] reasonBytes = EMTPY_REASON;
|
||||
byte[] reasonBytes = EmptyArrays.EMPTY_BYTES;
|
||||
if (reasonText != null) {
|
||||
reasonBytes = reasonText.getBytes(CharsetUtil.UTF_8);
|
||||
}
|
||||
|
@ -30,6 +30,7 @@ import io.netty.handler.codec.http.HttpObjectAggregator;
|
||||
import io.netty.handler.codec.http.HttpRequestDecoder;
|
||||
import io.netty.handler.codec.http.HttpResponseEncoder;
|
||||
import io.netty.handler.codec.http.HttpServerCodec;
|
||||
import io.netty.util.internal.EmptyArrays;
|
||||
import io.netty.util.internal.StringUtil;
|
||||
import io.netty.util.internal.logging.InternalLogger;
|
||||
import io.netty.util.internal.logging.InternalLoggerFactory;
|
||||
@ -44,8 +45,6 @@ import java.util.Set;
|
||||
public abstract class WebSocketServerHandshaker {
|
||||
protected static final InternalLogger logger = InternalLoggerFactory.getInstance(WebSocketServerHandshaker.class);
|
||||
|
||||
private static final String[] EMPTY_ARRAY = new String[0];
|
||||
|
||||
private final String uri;
|
||||
|
||||
private final String[] subprotocols;
|
||||
@ -81,7 +80,7 @@ public abstract class WebSocketServerHandshaker {
|
||||
}
|
||||
this.subprotocols = subprotocolArray;
|
||||
} else {
|
||||
this.subprotocols = EMPTY_ARRAY;
|
||||
this.subprotocols = EmptyArrays.EMPTY_STRINGS;
|
||||
}
|
||||
this.maxFramePayloadLength = maxFramePayloadLength;
|
||||
}
|
||||
|
@ -24,6 +24,7 @@ import io.netty.channel.ChannelHandlerContext;
|
||||
import io.netty.channel.ChannelInboundMessageHandler;
|
||||
import io.netty.channel.ChannelOutboundMessageHandler;
|
||||
import io.netty.channel.ChannelPromise;
|
||||
import io.netty.util.internal.EmptyArrays;
|
||||
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
@ -38,10 +39,8 @@ public class SpdySessionHandler
|
||||
private static final SpdyProtocolException STREAM_CLOSED = new SpdyProtocolException("Stream closed");
|
||||
|
||||
static {
|
||||
@SuppressWarnings("ZeroLengthArrayAllocation")
|
||||
StackTraceElement[] emptyTrace = new StackTraceElement[0];
|
||||
PROTOCOL_EXCEPTION.setStackTrace(emptyTrace);
|
||||
STREAM_CLOSED.setStackTrace(emptyTrace);
|
||||
PROTOCOL_EXCEPTION.setStackTrace(EmptyArrays.EMPTY_STACK_TRACE);
|
||||
STREAM_CLOSED.setStackTrace(EmptyArrays.EMPTY_STACK_TRACE);
|
||||
}
|
||||
|
||||
private final SpdySession spdySession = new SpdySession();
|
||||
|
@ -23,6 +23,7 @@ import io.netty.channel.ChannelFuture;
|
||||
import io.netty.channel.ChannelFutureListener;
|
||||
import io.netty.channel.ChannelHandlerContext;
|
||||
import io.netty.channel.ChannelPromise;
|
||||
import io.netty.util.internal.EmptyArrays;
|
||||
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
@ -33,8 +34,6 @@ import java.util.concurrent.atomic.AtomicBoolean;
|
||||
*/
|
||||
public class JZlibEncoder extends ZlibEncoder {
|
||||
|
||||
private static final byte[] EMPTY_ARRAY = new byte[0];
|
||||
|
||||
private final Deflater z = new Deflater();
|
||||
private final AtomicBoolean finished = new AtomicBoolean();
|
||||
private volatile ChannelHandlerContext ctx;
|
||||
@ -367,7 +366,7 @@ public class JZlibEncoder extends ZlibEncoder {
|
||||
synchronized (z) {
|
||||
try {
|
||||
// Configure input.
|
||||
z.next_in = EMPTY_ARRAY;
|
||||
z.next_in = EmptyArrays.EMPTY_BYTES;
|
||||
z.next_in_index = 0;
|
||||
z.avail_in = 0;
|
||||
|
||||
|
@ -16,6 +16,7 @@
|
||||
package io.netty.handler.codec.bytes;
|
||||
|
||||
import io.netty.channel.embedded.EmbeddedMessageChannel;
|
||||
import io.netty.util.internal.EmptyArrays;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
@ -48,7 +49,7 @@ public class ByteArrayDecoderTest {
|
||||
@Test
|
||||
public void testDecodeEmpty() {
|
||||
ch.writeInbound(EMPTY_BUFFER);
|
||||
assertThat((byte[]) ch.readInbound(), is(new byte[0]));
|
||||
assertThat((byte[]) ch.readInbound(), is(EmptyArrays.EMPTY_BYTES));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -17,6 +17,7 @@ package io.netty.handler.codec.bytes;
|
||||
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import io.netty.channel.embedded.EmbeddedMessageChannel;
|
||||
import io.netty.util.internal.EmptyArrays;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
@ -47,8 +48,7 @@ public class ByteArrayEncoderTest {
|
||||
|
||||
@Test
|
||||
public void testEncodeEmpty() {
|
||||
byte[] b = new byte[0];
|
||||
ch.writeOutbound(b);
|
||||
ch.writeOutbound(EmptyArrays.EMPTY_BYTES);
|
||||
assertThat(ch.readOutbound(), nullValue());
|
||||
}
|
||||
|
||||
|
36
common/src/main/java/io/netty/util/internal/EmptyArrays.java
Normal file
36
common/src/main/java/io/netty/util/internal/EmptyArrays.java
Normal file
@ -0,0 +1,36 @@
|
||||
/*
|
||||
* Copyright 2013 The Netty Project
|
||||
*
|
||||
* The Netty Project licenses this file to you under the Apache License,
|
||||
* version 2.0 (the "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at:
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package io.netty.util.internal;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
|
||||
public final class EmptyArrays {
|
||||
|
||||
public static final byte[] EMPTY_BYTES = new byte[0];
|
||||
public static final boolean[] EMPTY_BOOLEANS = new boolean[0];
|
||||
public static final double[] EMPTY_DOUBLES = new double[0];
|
||||
public static final float[] EMPTY_FLOATS = new float[0];
|
||||
public static final int[] EMPTY_INTS = new int[0];
|
||||
public static final short[] EMPTY_SHORTS = new short[0];
|
||||
public static final long[] EMPTY_LONGS = new long[0];
|
||||
public static final Object[] EMPTY_OBJECTS = new Object[0];
|
||||
public static final String[] EMPTY_STRINGS = new String[0];
|
||||
public static final StackTraceElement[] EMPTY_STACK_TRACE = new StackTraceElement[0];
|
||||
public static final ByteBuffer[] EMPTY_BYTE_BUFFERS = new ByteBuffer[0];
|
||||
|
||||
private EmptyArrays() { }
|
||||
}
|
@ -35,6 +35,7 @@ import io.netty.util.concurrent.EventExecutor;
|
||||
import io.netty.util.concurrent.Future;
|
||||
import io.netty.util.concurrent.GenericFutureListener;
|
||||
import io.netty.util.concurrent.ImmediateExecutor;
|
||||
import io.netty.util.internal.EmptyArrays;
|
||||
import io.netty.util.internal.PlatformDependent;
|
||||
import io.netty.util.internal.logging.InternalLogger;
|
||||
import io.netty.util.internal.logging.InternalLoggerFactory;
|
||||
@ -163,6 +164,16 @@ public class SslHandler
|
||||
"^.*(?:connection.*reset|connection.*closed|broken.*pipe).*$",
|
||||
Pattern.CASE_INSENSITIVE);
|
||||
|
||||
private static final SSLException SSLENGINE_CLOSED = new SSLException("SSLEngine closed already");
|
||||
private static final SSLException HANDSHAKE_TIMED_OUT = new SSLException("handshake timed out");
|
||||
private static final ClosedChannelException CHANNEL_CLOSED = new ClosedChannelException();
|
||||
|
||||
static {
|
||||
SSLENGINE_CLOSED.setStackTrace(EmptyArrays.EMPTY_STACK_TRACE);
|
||||
HANDSHAKE_TIMED_OUT.setStackTrace(EmptyArrays.EMPTY_STACK_TRACE);
|
||||
CHANNEL_CLOSED.setStackTrace(EmptyArrays.EMPTY_STACK_TRACE);
|
||||
}
|
||||
|
||||
private volatile ChannelHandlerContext ctx;
|
||||
private final SSLEngine engine;
|
||||
private final Executor delegatedTaskExecutor;
|
||||
@ -479,10 +490,9 @@ public class SslHandler
|
||||
// Any further write attempts should be denied.
|
||||
if (in.isReadable()) {
|
||||
in.clear();
|
||||
SSLException e = new SSLException("SSLEngine already closed");
|
||||
promise.setFailure(e);
|
||||
ctx.fireExceptionCaught(e);
|
||||
flush0(ctx, bytesConsumed, e);
|
||||
promise.setFailure(SSLENGINE_CLOSED);
|
||||
ctx.fireExceptionCaught(SSLENGINE_CLOSED);
|
||||
flush0(ctx, bytesConsumed, SSLENGINE_CLOSED);
|
||||
bytesConsumed = 0;
|
||||
}
|
||||
break;
|
||||
@ -597,9 +607,9 @@ public class SslHandler
|
||||
|
||||
@Override
|
||||
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
|
||||
// Make sure the handshake future is notified when a connection has
|
||||
// been closed during handshake.
|
||||
setHandshakeFailure(new ClosedChannelException());
|
||||
// Make sure to release SSLEngine,
|
||||
// and notify the handshake future if the connection has been closed during handshake.
|
||||
setHandshakeFailure(CHANNEL_CLOSED);
|
||||
|
||||
try {
|
||||
inboundBufferUpdated(ctx);
|
||||
@ -983,9 +993,8 @@ public class SslHandler
|
||||
return;
|
||||
}
|
||||
|
||||
SSLException e = new SSLException("handshake timed out");
|
||||
if (handshakePromise.tryFailure(e)) {
|
||||
ctx.fireExceptionCaught(e);
|
||||
if (handshakePromise.tryFailure(HANDSHAKE_TIMED_OUT)) {
|
||||
ctx.fireExceptionCaught(HANDSHAKE_TIMED_OUT);
|
||||
ctx.close();
|
||||
}
|
||||
}
|
||||
|
@ -18,6 +18,7 @@ package io.netty.channel;
|
||||
|
||||
import io.netty.util.concurrent.AbstractEventExecutorGroup;
|
||||
import io.netty.util.concurrent.EventExecutor;
|
||||
import io.netty.util.internal.EmptyArrays;
|
||||
import io.netty.util.internal.PlatformDependent;
|
||||
import io.netty.util.internal.ReadOnlyIterator;
|
||||
|
||||
@ -35,9 +36,6 @@ import java.util.concurrent.TimeUnit;
|
||||
*/
|
||||
public class ThreadPerChannelEventLoopGroup extends AbstractEventExecutorGroup implements EventLoopGroup {
|
||||
|
||||
private static final Object[] NO_ARGS = new Object[0];
|
||||
private static final StackTraceElement[] STACK_ELEMENTS = new StackTraceElement[0];
|
||||
|
||||
private final Object[] childArgs;
|
||||
private final int maxChannels;
|
||||
final ThreadFactory threadFactory;
|
||||
@ -88,7 +86,7 @@ public class ThreadPerChannelEventLoopGroup extends AbstractEventExecutorGroup i
|
||||
}
|
||||
|
||||
if (args == null) {
|
||||
childArgs = NO_ARGS;
|
||||
childArgs = EmptyArrays.EMPTY_OBJECTS;
|
||||
} else {
|
||||
childArgs = args.clone();
|
||||
}
|
||||
@ -97,7 +95,7 @@ public class ThreadPerChannelEventLoopGroup extends AbstractEventExecutorGroup i
|
||||
this.threadFactory = threadFactory;
|
||||
|
||||
tooManyChannels = new ChannelException("too many channels (max: " + maxChannels + ')');
|
||||
tooManyChannels.setStackTrace(STACK_ELEMENTS);
|
||||
tooManyChannels.setStackTrace(EmptyArrays.EMPTY_STACK_TRACE);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -27,6 +27,7 @@ import io.netty.channel.socket.DatagramChannel;
|
||||
import io.netty.channel.socket.DatagramChannelConfig;
|
||||
import io.netty.channel.socket.DatagramPacket;
|
||||
import io.netty.channel.socket.DefaultDatagramChannelConfig;
|
||||
import io.netty.util.internal.EmptyArrays;
|
||||
import io.netty.util.internal.PlatformDependent;
|
||||
import io.netty.util.internal.logging.InternalLogger;
|
||||
import io.netty.util.internal.logging.InternalLoggerFactory;
|
||||
@ -52,11 +53,9 @@ public class OioDatagramChannel extends AbstractOioMessageChannel
|
||||
|
||||
private static final ChannelMetadata METADATA = new ChannelMetadata(BufType.MESSAGE, true);
|
||||
|
||||
private static final byte[] EMPTY_DATA = new byte[0];
|
||||
|
||||
private final MulticastSocket socket;
|
||||
private final DatagramChannelConfig config;
|
||||
private final java.net.DatagramPacket tmpPacket = new java.net.DatagramPacket(EMPTY_DATA, 0);
|
||||
private final java.net.DatagramPacket tmpPacket = new java.net.DatagramPacket(EmptyArrays.EMPTY_BYTES, 0);
|
||||
|
||||
private static MulticastSocket newSocket() {
|
||||
try {
|
||||
|
Loading…
Reference in New Issue
Block a user