diff --git a/src/main/java/org/jboss/netty/buffer/ChannelBuffers.java b/src/main/java/org/jboss/netty/buffer/ChannelBuffers.java index b3239b5cb3..57c7c67e31 100644 --- a/src/main/java/org/jboss/netty/buffer/ChannelBuffers.java +++ b/src/main/java/org/jboss/netty/buffer/ChannelBuffers.java @@ -753,35 +753,35 @@ public class ChannelBuffers { final int aLen = bufferA.readableBytes(); final int bLen = bufferB.readableBytes(); final int minLength = Math.min(aLen, bLen); - final int longCount = minLength >>> 3; - final int byteCount = minLength & 7; + final int uintCount = minLength >>> 2; + final int byteCount = minLength & 3; int aIndex = bufferA.readerIndex(); int bIndex = bufferB.readerIndex(); if (bufferA.order() == bufferB.order()) { - for (int i = longCount; i > 0; i --) { - long va = bufferA.getLong(aIndex); - long vb = bufferB.getLong(bIndex); + for (int i = uintCount; i > 0; i --) { + long va = bufferA.getUnsignedInt(aIndex); + long vb = bufferB.getUnsignedInt(bIndex); if (va > vb) { return 1; } else if (va < vb) { return -1; } - aIndex += 8; - bIndex += 8; + aIndex += 4; + bIndex += 4; } } else { - for (int i = longCount; i > 0; i --) { - long va = bufferA.getLong(aIndex); - long vb = swapLong(bufferB.getLong(bIndex)); + for (int i = uintCount; i > 0; i --) { + long va = bufferA.getUnsignedInt(aIndex); + long vb = swapInt(bufferB.getInt(bIndex)) & 0xFFFFFFFFL; if (va > vb) { return 1; } else if (va < vb) { return -1; } - aIndex += 8; - bIndex += 8; + aIndex += 4; + bIndex += 4; } } diff --git a/src/main/java/org/jboss/netty/channel/socket/nio/NioProviderMetadata.java b/src/main/java/org/jboss/netty/channel/socket/nio/NioProviderMetadata.java index b25f29126c..40d666deb4 100644 --- a/src/main/java/org/jboss/netty/channel/socket/nio/NioProviderMetadata.java +++ b/src/main/java/org/jboss/netty/channel/socket/nio/NioProviderMetadata.java @@ -337,7 +337,7 @@ class NioProviderMetadata { loop.done = true; loop.selector.wakeup(); try { - executor.shutdown(); + executor.shutdownNow(); for (;;) { try { if (executor.awaitTermination(1, TimeUnit.SECONDS)) { diff --git a/src/test/java/org/jboss/netty/bootstrap/AbstractSocketClientBootstrapTest.java b/src/test/java/org/jboss/netty/bootstrap/AbstractSocketClientBootstrapTest.java index 4518e13a70..6d31aa31e3 100644 --- a/src/test/java/org/jboss/netty/bootstrap/AbstractSocketClientBootstrapTest.java +++ b/src/test/java/org/jboss/netty/bootstrap/AbstractSocketClientBootstrapTest.java @@ -61,7 +61,7 @@ public abstract class AbstractSocketClientBootstrapTest { @AfterClass public static void destroy() { - executor.shutdown(); + executor.shutdownNow(); for (;;) { try { if (executor.awaitTermination(1, TimeUnit.MILLISECONDS)) { diff --git a/src/test/java/org/jboss/netty/bootstrap/AbstractSocketServerBootstrapTest.java b/src/test/java/org/jboss/netty/bootstrap/AbstractSocketServerBootstrapTest.java index 0d39d89847..ccf7195d33 100644 --- a/src/test/java/org/jboss/netty/bootstrap/AbstractSocketServerBootstrapTest.java +++ b/src/test/java/org/jboss/netty/bootstrap/AbstractSocketServerBootstrapTest.java @@ -67,7 +67,7 @@ public abstract class AbstractSocketServerBootstrapTest { @AfterClass public static void destroy() { - executor.shutdown(); + executor.shutdownNow(); for (;;) { try { if (executor.awaitTermination(1, TimeUnit.MILLISECONDS)) { diff --git a/src/test/java/org/jboss/netty/buffer/AbstractChannelBufferTest.java b/src/test/java/org/jboss/netty/buffer/AbstractChannelBufferTest.java index 35ae8e850b..f42add4067 100644 --- a/src/test/java/org/jboss/netty/buffer/AbstractChannelBufferTest.java +++ b/src/test/java/org/jboss/netty/buffer/AbstractChannelBufferTest.java @@ -1470,11 +1470,20 @@ public abstract class AbstractChannelBufferTest { // Expected } + // Fill the random stuff byte[] value = new byte[32]; - buffer.setIndex(0, value.length); random.nextBytes(value); + // Prevent overflow / underflow + if (value[0] == 0) { + value[0] ++; + } else if (value[0] == -1) { + value[0] --; + } + + buffer.setIndex(0, value.length); buffer.setBytes(0, value); + assertEquals(0, buffer.compareTo(wrappedBuffer(BIG_ENDIAN, value))); assertEquals(0, buffer.compareTo(wrappedBuffer(LITTLE_ENDIAN, value))); diff --git a/src/test/java/org/jboss/netty/channel/socket/AbstractSocketEchoTest.java b/src/test/java/org/jboss/netty/channel/socket/AbstractSocketEchoTest.java index c069efb0a2..1ea7ebc6db 100644 --- a/src/test/java/org/jboss/netty/channel/socket/AbstractSocketEchoTest.java +++ b/src/test/java/org/jboss/netty/channel/socket/AbstractSocketEchoTest.java @@ -77,7 +77,7 @@ public abstract class AbstractSocketEchoTest { @AfterClass public static void destroy() { - executor.shutdown(); + executor.shutdownNow(); for (;;) { try { if (executor.awaitTermination(1, TimeUnit.MILLISECONDS)) { diff --git a/src/test/java/org/jboss/netty/channel/socket/NioClientSocketShutdownTimeTest.java b/src/test/java/org/jboss/netty/channel/socket/NioClientSocketShutdownTimeTest.java new file mode 100644 index 0000000000..90b0c40370 --- /dev/null +++ b/src/test/java/org/jboss/netty/channel/socket/NioClientSocketShutdownTimeTest.java @@ -0,0 +1,109 @@ +/* + * JBoss, Home of Professional Open Source + * + * Copyright 2008, Red Hat Middleware LLC, and individual contributors + * by the @author tags. See the COPYRIGHT.txt in the distribution for a + * full listing of individual contributors. + * + * This is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this software; if not, write to the Free + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA, or see the FSF site: http://www.fsf.org. + */ +package org.jboss.netty.channel.socket; + +import static org.junit.Assert.*; + +import java.io.IOException; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.nio.channels.ServerSocketChannel; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; + +import org.jboss.netty.bootstrap.ClientBootstrap; +import org.jboss.netty.channel.ChannelFuture; +import org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory; +import org.junit.Test; + + +/** + * @author The Netty Project (netty-dev@lists.jboss.org) + * @author Trustin Lee (tlee@redhat.com) + * + * @version $Rev$, $Date$ + * + */ +public class NioClientSocketShutdownTimeTest { + + @Test + public void testShutdownTime() throws Throwable { + ServerSocketChannel serverSocket = ServerSocketChannel.open(); + serverSocket.socket().bind(new InetSocketAddress(0)); + + long startTime = System.currentTimeMillis(); + + ExecutorService e1 = Executors.newCachedThreadPool(); + ExecutorService e2 = Executors.newCachedThreadPool(); + ClientBootstrap b = new ClientBootstrap(new NioClientSocketChannelFactory(e1, e2)); + + try { + serverSocket.configureBlocking(false); + + ChannelFuture f = b.connect(new InetSocketAddress( + InetAddress.getLocalHost(), + serverSocket.socket().getLocalPort())); + + serverSocket.accept(); + f.awaitUninterruptibly(); + + if (f.getCause() != null) { + throw f.getCause(); + } + assertTrue(f.isSuccess()); + + f.getChannel().close().awaitUninterruptibly(); + } finally { + assertEquals(0, e1.shutdownNow().size()); + assertEquals(0, e2.shutdownNow().size()); + for (;;) { + try { + if (e1.awaitTermination(1, TimeUnit.SECONDS)) { + break; + } + } catch (InterruptedException ex) { + // Ignore + } + } + for (;;) { + try { + if (e2.awaitTermination(1, TimeUnit.SECONDS)) { + break; + } + } catch (InterruptedException ex) { + // Ignore + } + } + + try { + serverSocket.close(); + } catch (IOException ex) { + // Ignore. + } + } + + long shutdownTime = System.currentTimeMillis() - startTime; + assertTrue("Shutdown takes too long: " + shutdownTime + " ms", shutdownTime < 500); + } +} diff --git a/src/test/java/org/jboss/netty/handler/codec/frame/AbstractSocketFixedLengthEchoTest.java b/src/test/java/org/jboss/netty/handler/codec/frame/AbstractSocketFixedLengthEchoTest.java index 6dcc2c6371..697b38919b 100644 --- a/src/test/java/org/jboss/netty/handler/codec/frame/AbstractSocketFixedLengthEchoTest.java +++ b/src/test/java/org/jboss/netty/handler/codec/frame/AbstractSocketFixedLengthEchoTest.java @@ -47,7 +47,6 @@ import org.jboss.netty.channel.ChannelStateEvent; import org.jboss.netty.channel.ExceptionEvent; import org.jboss.netty.channel.MessageEvent; import org.jboss.netty.channel.SimpleChannelHandler; -import org.jboss.netty.handler.codec.frame.FixedLengthFrameDecoder; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @@ -78,7 +77,7 @@ public abstract class AbstractSocketFixedLengthEchoTest { @AfterClass public static void destroy() { - executor.shutdown(); + executor.shutdownNow(); for (;;) { try { if (executor.awaitTermination(1, TimeUnit.MILLISECONDS)) { diff --git a/src/test/java/org/jboss/netty/handler/codec/serialization/AbstractSocketCompatibleObjectStreamEchoTest.java b/src/test/java/org/jboss/netty/handler/codec/serialization/AbstractSocketCompatibleObjectStreamEchoTest.java index 5cc888aaa9..82b8dfb7c8 100644 --- a/src/test/java/org/jboss/netty/handler/codec/serialization/AbstractSocketCompatibleObjectStreamEchoTest.java +++ b/src/test/java/org/jboss/netty/handler/codec/serialization/AbstractSocketCompatibleObjectStreamEchoTest.java @@ -83,7 +83,7 @@ public abstract class AbstractSocketCompatibleObjectStreamEchoTest { @AfterClass public static void destroy() { - executor.shutdown(); + executor.shutdownNow(); for (;;) { try { if (executor.awaitTermination(1, TimeUnit.MILLISECONDS)) { diff --git a/src/test/java/org/jboss/netty/handler/codec/serialization/AbstractSocketObjectStreamEchoTest.java b/src/test/java/org/jboss/netty/handler/codec/serialization/AbstractSocketObjectStreamEchoTest.java index 3b79d1934f..2ae93e9df8 100644 --- a/src/test/java/org/jboss/netty/handler/codec/serialization/AbstractSocketObjectStreamEchoTest.java +++ b/src/test/java/org/jboss/netty/handler/codec/serialization/AbstractSocketObjectStreamEchoTest.java @@ -83,7 +83,7 @@ public abstract class AbstractSocketObjectStreamEchoTest { @AfterClass public static void destroy() { - executor.shutdown(); + executor.shutdownNow(); for (;;) { try { if (executor.awaitTermination(1, TimeUnit.MILLISECONDS)) { diff --git a/src/test/java/org/jboss/netty/handler/codec/string/AbstractSocketStringEchoTest.java b/src/test/java/org/jboss/netty/handler/codec/string/AbstractSocketStringEchoTest.java index 2b7346aa10..865073940c 100644 --- a/src/test/java/org/jboss/netty/handler/codec/string/AbstractSocketStringEchoTest.java +++ b/src/test/java/org/jboss/netty/handler/codec/string/AbstractSocketStringEchoTest.java @@ -85,7 +85,7 @@ public abstract class AbstractSocketStringEchoTest { @AfterClass public static void destroy() { - executor.shutdown(); + executor.shutdownNow(); for (;;) { try { if (executor.awaitTermination(1, TimeUnit.MILLISECONDS)) { diff --git a/src/test/java/org/jboss/netty/handler/ssl/AbstractSocketSslEchoTest.java b/src/test/java/org/jboss/netty/handler/ssl/AbstractSocketSslEchoTest.java index 088bef1cf5..2a16270a84 100644 --- a/src/test/java/org/jboss/netty/handler/ssl/AbstractSocketSslEchoTest.java +++ b/src/test/java/org/jboss/netty/handler/ssl/AbstractSocketSslEchoTest.java @@ -80,7 +80,7 @@ public abstract class AbstractSocketSslEchoTest { @AfterClass public static void destroy() { - executor.shutdown(); + executor.shutdownNow(); for (;;) { try { if (executor.awaitTermination(1, TimeUnit.MILLISECONDS)) {