Skip to content
Commits on Source (8)
......@@ -37,7 +37,7 @@
<parent>
<groupId>org.jboss.xnio</groupId>
<artifactId>xnio-all</artifactId>
<version>3.6.3.Final</version>
<version>3.7.0.Final</version>
</parent>
<dependencies>
......
......@@ -155,6 +155,20 @@ public final class ByteBufferSlicePool implements Pool<ByteBuffer> {
}
}
/**
* Cleans all ThreadLocal caches
*/
public void clean() {
ThreadLocalCache localCache = localQueueHolder.get();
if (!localCache.queue.isEmpty()) {
localCache.queue.clear();
}
if(!sliceQueue.isEmpty()) {
sliceQueue.clear();
}
}
/**
* Return the size of the {@link ByteBuffer}s that are returned by {@link #allocate()}.
*/
......
......@@ -251,7 +251,7 @@ public abstract class XnioIoThread extends Thread implements XnioExecutor, XnioI
}
}
InetSocketAddress bindAddress = getWorker().getBindAddressTable().get(destination.getAddress());
return openTcpStreamConnection(bindAddress == null ? Xnio.ANY_INET_ADDRESS : bindAddress, destination, openListener, bindListener, optionMap);
return openTcpStreamConnection(bindAddress, destination, openListener, bindListener, optionMap);
}
public IoFuture<StreamConnection> openStreamConnection(SocketAddress bindAddress, SocketAddress destination, ChannelListener<? super StreamConnection> openListener, ChannelListener<? super BoundChannel> bindListener, OptionMap optionMap) {
......
......@@ -128,16 +128,23 @@ public abstract class XnioWorker extends AbstractExecutorService implements Conf
};
final ExecutorService executorService = builder.getExternalExecutorService();
if (executorService != null) {
taskPool = new ExternalTaskPool(executorService);
if (executorService instanceof EnhancedQueueExecutor) {
taskPool = new ExternalTaskPool(
new EnhancedQueueExecutorTaskPool((EnhancedQueueExecutor) executorService));
} else if (executorService instanceof ThreadPoolExecutor) {
taskPool = new ExternalTaskPool(new ThreadPoolExecutorTaskPool((ThreadPoolExecutor) executorService));
} else {
taskPool = new ExternalTaskPool(new ExecutorServiceTaskPool(executorService));
}
} else if (EnhancedQueueExecutor.DISABLE_HINT) {
final int poolSize = max(builder.getMaxWorkerPoolSize(), builder.getCoreWorkerPoolSize());
taskPool = new ThreadPoolExecutorTaskPool(
taskPool = new ThreadPoolExecutorTaskPool(new DefaultThreadPoolExecutor(
poolSize,
poolSize,
builder.getWorkerKeepAlive(), TimeUnit.MILLISECONDS,
new LinkedBlockingDeque<>(),
new WorkerThreadFactory(builder.getThreadGroup(), builder.getWorkerStackSize(), markThreadAsDaemon),
terminationTask);
terminationTask));
} else {
taskPool = new EnhancedQueueExecutorTaskPool(new EnhancedQueueExecutor.Builder()
.setCorePoolSize(builder.getCoreWorkerPoolSize())
......@@ -948,6 +955,15 @@ public abstract class XnioWorker extends AbstractExecutorService implements Conf
return taskPool.getActiveCount();
}
/**
* Get an estimate of the number of threads in the worker pool.
*
* @return the estimated number of threads in the worker pool
*/
protected final int getWorkerPoolSize() {
return taskPool.getPoolSize();
}
/**
* Get the maximum worker pool size.
*
......@@ -1290,13 +1306,15 @@ public abstract class XnioWorker extends AbstractExecutorService implements Conf
int getActiveCount();
int getPoolSize();
int getQueueSize();
}
static class ThreadPoolExecutorTaskPool extends ThreadPoolExecutor implements TaskPool {
static class DefaultThreadPoolExecutor extends ThreadPoolExecutor {
private final Runnable terminationTask;
ThreadPoolExecutorTaskPool(final int corePoolSize, final int maximumPoolSize, final long keepAliveTime, final TimeUnit unit, final BlockingQueue<Runnable> workQueue, final ThreadFactory threadFactory, final Runnable terminationTask) {
DefaultThreadPoolExecutor(final int corePoolSize, final int maximumPoolSize, final long keepAliveTime, final TimeUnit unit, final BlockingQueue<Runnable> workQueue, final ThreadFactory threadFactory, final Runnable terminationTask) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory);
this.terminationTask = terminationTask;
}
......@@ -1318,9 +1336,73 @@ public abstract class XnioWorker extends AbstractExecutorService implements Conf
super.setMaximumPoolSize(size);
}
}
}
static class ThreadPoolExecutorTaskPool implements TaskPool {
private final ThreadPoolExecutor delegate;
ThreadPoolExecutorTaskPool(final ThreadPoolExecutor delegate) {
this.delegate = delegate;
}
@Override
public void shutdown() {
delegate.shutdown();
}
@Override
public List<Runnable> shutdownNow() {
return delegate.shutdownNow();
}
@Override
public void execute(final Runnable command) {
delegate.execute(command);
}
@Override
public int getCorePoolSize() {
return delegate.getCorePoolSize();
}
@Override
public int getMaximumPoolSize() {
return delegate.getMaximumPoolSize();
}
@Override
public long getKeepAliveTime(final TimeUnit unit) {
return delegate.getKeepAliveTime(unit);
}
@Override
public void setCorePoolSize(final int size) {
delegate.setCorePoolSize(size);
}
@Override
public void setMaximumPoolSize(final int size) {
delegate.setMaximumPoolSize(size);
}
@Override
public void setKeepAliveTime(final long time, final TimeUnit unit) {
delegate.setKeepAliveTime(time, unit);
}
@Override
public int getActiveCount() {
return delegate.getActiveCount();
}
@Override
public int getPoolSize() {
return delegate.getPoolSize();
}
@Override
public int getQueueSize() {
return getQueue().size();
return delegate.getQueue().size();
}
}
......@@ -1371,24 +1453,28 @@ public abstract class XnioWorker extends AbstractExecutorService implements Conf
return executor.getActiveCount();
}
public int getPoolSize() {
return executor.getPoolSize();
}
public int getQueueSize() {
return executor.getQueueSize();
}
}
static class ExternalTaskPool implements TaskPool {
static class ExecutorServiceTaskPool implements TaskPool {
private final ExecutorService delegate;
ExternalTaskPool(final ExecutorService delegate) {
ExecutorServiceTaskPool(final ExecutorService delegate) {
this.delegate = delegate;
}
public void shutdown() {
// no operation
delegate.shutdown();
}
public List<Runnable> shutdownNow() {
return Collections.emptyList();
return delegate.shutdownNow();
}
public void execute(final Runnable command) {
......@@ -1420,9 +1506,81 @@ public abstract class XnioWorker extends AbstractExecutorService implements Conf
return -1;
}
public int getPoolSize() {
return -1;
}
public int getQueueSize() {
return -1;
}
}
static class ExternalTaskPool implements TaskPool {
private final TaskPool delegate;
ExternalTaskPool(final TaskPool delegate) {
this.delegate = delegate;
}
@Override
public void shutdown() {
// no operation
}
@Override
public List<Runnable> shutdownNow() {
return Collections.emptyList();
}
@Override
public void execute(final Runnable command) {
delegate.execute(command);
}
@Override
public int getCorePoolSize() {
return delegate.getCorePoolSize();
}
@Override
public int getMaximumPoolSize() {
return delegate.getMaximumPoolSize();
}
@Override
public long getKeepAliveTime(final TimeUnit unit) {
return delegate.getKeepAliveTime(unit);
}
@Override
public void setCorePoolSize(final int size) {
delegate.setCorePoolSize(size);
}
@Override
public void setMaximumPoolSize(final int size) {
delegate.setMaximumPoolSize(size);
}
@Override
public void setKeepAliveTime(final long time, final TimeUnit unit) {
delegate.setKeepAliveTime(time, unit);
}
@Override
public int getActiveCount() {
return delegate.getActiveCount();
}
@Override
public int getPoolSize() {
return delegate.getPoolSize();
}
@Override
public int getQueueSize() {
return delegate.getQueueSize();
}
}
}
......@@ -61,6 +61,13 @@ public interface XnioWorkerMXBean {
*/
int getMaxWorkerPoolSize();
/**
* Get an estimate of the number of threads in the worker pool.
*
* @return the estimated number of threads in the worker pool
*/
int getWorkerPoolSize();
/**
* Get an estimate of the number of busy threads in the worker pool.
*
......
......@@ -594,7 +594,7 @@ final class JsseSslConduitEngine {
public long unwrap(final ByteBuffer[] dsts, final int offset, final int length) throws IOException {
assert ! Thread.holdsLock(getUnwrapLock());
assert ! Thread.holdsLock(getWrapLock());
if (dsts.length == 0 || length == 0) {
if (dsts.length == 0 || length == 0 || isClosed()) {
return 0L;
}
clearFlags(FIRST_HANDSHAKE | BUFFER_UNDERFLOW);
......
......@@ -109,7 +109,7 @@ final class JsseSslStreamSourceConduit extends AbstractStreamSourceConduit<Strea
if (offs < 0 || offs > len || len < 0 || offs + len > dsts.length) {
throw new ArrayIndexOutOfBoundsException();
}
if ((!sslEngine.isDataAvailable() && sslEngine.isInboundClosed()) || sslEngine.isClosed()) {
if (sslEngine.isClosed() || (!sslEngine.isDataAvailable() && sslEngine.isInboundClosed())) {
return -1;
}
final int readResult;
......
......@@ -66,7 +66,7 @@ import org.xnio.channels.ConnectedStreamChannel;
public final class JsseXnioSsl extends XnioSsl {
public static final boolean NEW_IMPL = doPrivileged((PrivilegedAction<Boolean>) () -> Boolean.valueOf(Boolean.parseBoolean(System.getProperty("org.xnio.ssl.new", "false")))).booleanValue();
static final Pool<ByteBuffer> bufferPool = new ByteBufferSlicePool(BufferAllocator.DIRECT_BYTE_BUFFER_ALLOCATOR, 17 * 1024, 17 * 1024 * 128);
static final Pool<ByteBuffer> bufferPool = new ByteBufferSlicePool(BufferAllocator.DIRECT_BYTE_BUFFER_ALLOCATOR, 21 * 1024, 21 * 1024 * 128);
private final SSLContext sslContext;
/**
......
......@@ -199,7 +199,7 @@ public class XnioWorkerTestCase {
@Test
public void connectTcpStream() throws CancellationException, IOException {
checkConnectStream(new InetSocketAddress(1000), Xnio.ANY_INET_ADDRESS, XnioWorkerMock.TCP_CHANNEL_INFO);
checkConnectStream(new InetSocketAddress(1000), null, XnioWorkerMock.TCP_CHANNEL_INFO);
}
@Test
......@@ -230,7 +230,7 @@ public class XnioWorkerTestCase {
@Test
public void connectTcpStreamWithBindListener() throws CancellationException, IOException {
checkConnectStreamWithBindListener(new InetSocketAddress(1500), Xnio.ANY_INET_ADDRESS, XnioWorkerMock.TCP_CHANNEL_INFO);
checkConnectStreamWithBindListener(new InetSocketAddress(1500), null, XnioWorkerMock.TCP_CHANNEL_INFO);
}
@Test
......
jboss-xnio (3.6.3-1) UNRELEASED; urgency=medium
jboss-xnio (3.7.0-1) unstable; urgency=medium
* New upstream version 3.6.3.
* Declare compliance with Debian Policy 4.1.4.
* New upstream version 3.7.0.
* Declare compliance with Debian Policy 4.3.0.
-- Markus Koschany <apo@debian.org> Tue, 15 May 2018 15:21:59 +0200
-- Markus Koschany <apo@debian.org> Fri, 08 Feb 2019 11:23:04 +0100
jboss-xnio (3.6.2-2) unstable; urgency=medium
......
......@@ -20,9 +20,9 @@ Build-Depends:
libwildfly-client-config-java,
libwildfly-common-java,
maven-debian-helper (>= 1.5)
Standards-Version: 4.1.4
Vcs-Git: https://anonscm.debian.org/git/pkg-java/jboss-xnio.git
Vcs-Browser: https://anonscm.debian.org/cgit/pkg-java/jboss-xnio.git
Standards-Version: 4.3.0
Vcs-Git: https://salsa.debian.org/java-team/jboss-xnio.git
Vcs-Browser: https://salsa.debian.org/java-team/jboss-xnio
Homepage: http://xnio.jboss.org/
Package: libjboss-xnio-java
......
......@@ -3,7 +3,7 @@ Upstream-Name: Jboss XNIO
Source: https://github.com/xnio/xnio
Files: *
Copyright: 2015-2018, Red Hat, Inc.
Copyright: 2015-2019, Red Hat, Inc.
License: Apache-2.0
Files: nio-impl/src/test/java/org/xnio/nio/test/NioHalfDuplexChannelPipeTestCase.java
......@@ -17,7 +17,7 @@ Copyright: 2010-2015, Red Hat, Inc
License: LGPL-2.1+
Files: debian/*
Copyright: 2015-2018, Markus Koschany <apo@debian.org>
Copyright: 2015-2019, Markus Koschany <apo@debian.org>
License: Apache-2.0 or LGPL-2.1+
License: Apache-2.0
......
# Include here properties to pass to Maven during the build.
# For example:
maven.test.skip=true
maven.compiler.source=1.9
maven.compiler.target=1.9
maven.compiler.source=1.8
maven.compiler.target=1.8
project.build.sourceEncoding=UTF-8
From: Markus Koschany <apo@debian.org>
Date: Mon, 19 Mar 2018 11:09:53 +0100
Subject: java9
---
api/pom.xml | 3 +++
1 file changed, 3 insertions(+)
diff --git a/api/pom.xml b/api/pom.xml
index 43377f1..10fff5b 100644
--- a/api/pom.xml
+++ b/api/pom.xml
@@ -181,6 +181,9 @@
<artifactId>maven-javadoc-plugin</artifactId>
<configuration>
<additionalparam>-Xdoclint:none</additionalparam>
+ <compilerArgs>
+ <arg>--add-modules</arg><arg>java.xml.ws.annotation</arg>
+ </compilerArgs>
<doctitle><![CDATA[XNIO API ]]>${project.version}</doctitle>
<header><![CDATA[XNIO API ]]>${project.version}</header>
<footer><![CDATA[XNIO API ]]>${project.version}</footer>
maven-bundle-plugin-rules.patch
java9.patch
......@@ -31,7 +31,7 @@
<parent>
<groupId>org.jboss.xnio</groupId>
<artifactId>xnio-all</artifactId>
<version>3.6.3.Final</version>
<version>3.7.0.Final</version>
</parent>
<properties>
......
......@@ -30,6 +30,7 @@ import java.lang.reflect.InvocationTargetException;
import org.xnio.FileSystemWatcher;
import org.xnio.IoUtils;
import org.xnio.Options;
import org.xnio.ReadPropertyAction;
import org.xnio.Xnio;
import org.xnio.OptionMap;
import org.xnio.XnioWorker;
......@@ -75,6 +76,8 @@ final class NioXnio extends Xnio {
final Object[] objects = AccessController.doPrivileged(
new PrivilegedAction<Object[]>() {
public Object[] run() {
String jdkVersion = System.getProperty("java.specification.version", "1.8");
final boolean jdk9 = ! (jdkVersion.equals("1.8") || jdkVersion.equals("8"));
final SelectorProvider defaultProvider = SelectorProvider.provider();
final String chosenProvider = System.getProperty("xnio.nio.selector.provider");
SelectorProvider provider = null;
......@@ -87,6 +90,8 @@ final class NioXnio extends Xnio {
provider = null;
}
}
if (! jdk9) {
// try to probe the best available provider
if (provider == null) {
try {
// Mac OS X and BSD
......@@ -147,6 +152,7 @@ final class NioXnio extends Xnio {
provider = null;
}
}
}
if (provider == null) {
try {
defaultProvider.openSelector().close();
......@@ -189,7 +195,7 @@ final class NioXnio extends Xnio {
} catch (Exception e) {
// not available
}
if (! defaultIsPoll) {
if (! defaultIsPoll && ! jdk9) {
// default is fine for main selectors; we should try to get poll for temp though
if (objects[1] == null) try {
SelectorProvider pollSelectorProvider = Class.forName("sun.nio.ch.PollSelectorProvider", true, NioXnio.class.getClassLoader()).asSubclass(SelectorProvider.class).getConstructor().newInstance();
......
......@@ -413,6 +413,10 @@ final class NioXnioWorker extends XnioWorker {
return NioXnioWorker.this.getMaxWorkerPoolSize();
}
public int getWorkerPoolSize() {
return NioXnioWorker.this.getWorkerPoolSize();
}
public int getBusyWorkerThreadCount() {
return NioXnioWorker.this.getBusyWorkerThreadCount();
}
......
......@@ -32,7 +32,7 @@
<artifactId>xnio-all</artifactId>
<packaging>pom</packaging>
<name>XNIO Parent POM</name>
<version>3.6.3.Final</version>
<version>3.7.0.Final</version>
<description>The aggregator POM of the XNIO project</description>
<licenses>
......