Move generic unix classes/interfaces out of epoll package
Motivation: As we plan to have other native transports soon (like a kqueue transport) we should move unix classes/interfaces out of the epoll package so we introduce other implementations without breaking stuff before the next stable release. Modifications: Create a new io.netty.channel.unix package and move stuff over there. Result: Possible to introduce other native impls beside epoll.
This commit is contained in:
parent
d83700bd0a
commit
98925a1fa4
@ -0,0 +1,26 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2015 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.
|
||||||
|
*/
|
||||||
|
#include <jni.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include "io_netty_channel_unix_FileDescriptor.h"
|
||||||
|
|
||||||
|
JNIEXPORT int JNICALL Java_io_netty_channel_unix_FileDescriptor_close(JNIEnv* env, jclass clazz, jint fd) {
|
||||||
|
if (close(fd) < 0) {
|
||||||
|
return -errno;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
@ -0,0 +1,18 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2014 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.
|
||||||
|
*/
|
||||||
|
#include <jni.h>
|
||||||
|
|
||||||
|
int Java_io_netty_channel_unix_FileDescriptor_close(JNIEnv* env, jclass clazz, jint fd);
|
@ -23,7 +23,8 @@ import io.netty.channel.AbstractChannel;
|
|||||||
import io.netty.channel.Channel;
|
import io.netty.channel.Channel;
|
||||||
import io.netty.channel.ChannelMetadata;
|
import io.netty.channel.ChannelMetadata;
|
||||||
import io.netty.channel.EventLoop;
|
import io.netty.channel.EventLoop;
|
||||||
import io.netty.channel.FileDescriptor;
|
import io.netty.channel.unix.FileDescriptor;
|
||||||
|
import io.netty.channel.unix.UnixChannel;
|
||||||
import io.netty.util.ReferenceCountUtil;
|
import io.netty.util.ReferenceCountUtil;
|
||||||
import io.netty.util.internal.OneTimeTask;
|
import io.netty.util.internal.OneTimeTask;
|
||||||
|
|
||||||
@ -31,7 +32,7 @@ import java.net.InetSocketAddress;
|
|||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
import java.nio.channels.UnresolvedAddressException;
|
import java.nio.channels.UnresolvedAddressException;
|
||||||
|
|
||||||
abstract class AbstractEpollChannel extends AbstractChannel {
|
abstract class AbstractEpollChannel extends AbstractChannel implements UnixChannel {
|
||||||
private static final ChannelMetadata DATA = new ChannelMetadata(false);
|
private static final ChannelMetadata DATA = new ChannelMetadata(false);
|
||||||
private final int readFlag;
|
private final int readFlag;
|
||||||
private volatile FileDescriptor fileDescriptor;
|
private volatile FileDescriptor fileDescriptor;
|
||||||
@ -44,7 +45,7 @@ abstract class AbstractEpollChannel extends AbstractChannel {
|
|||||||
}
|
}
|
||||||
|
|
||||||
AbstractEpollChannel(Channel parent, int fd, int flag, boolean active) {
|
AbstractEpollChannel(Channel parent, int fd, int flag, boolean active) {
|
||||||
this(parent, new NativeFileDescriptor(fd), flag, active);
|
this(parent, new FileDescriptor(fd), flag, active);
|
||||||
}
|
}
|
||||||
|
|
||||||
AbstractEpollChannel(Channel parent, FileDescriptor fd, int flag, boolean active) {
|
AbstractEpollChannel(Channel parent, FileDescriptor fd, int flag, boolean active) {
|
||||||
@ -76,9 +77,7 @@ abstract class AbstractEpollChannel extends AbstractChannel {
|
|||||||
return (flags & flag) != 0;
|
return (flags & flag) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
@Override
|
||||||
* Returns the {@link FileDescriptor} that is used by this {@link Channel}.
|
|
||||||
*/
|
|
||||||
public final FileDescriptor fd() {
|
public final FileDescriptor fd() {
|
||||||
return fileDescriptor;
|
return fileDescriptor;
|
||||||
}
|
}
|
||||||
|
@ -20,8 +20,8 @@ import io.netty.channel.ChannelOutboundBuffer;
|
|||||||
import io.netty.channel.ChannelPipeline;
|
import io.netty.channel.ChannelPipeline;
|
||||||
import io.netty.channel.ChannelPromise;
|
import io.netty.channel.ChannelPromise;
|
||||||
import io.netty.channel.EventLoop;
|
import io.netty.channel.EventLoop;
|
||||||
import io.netty.channel.FileDescriptor;
|
|
||||||
import io.netty.channel.ServerChannel;
|
import io.netty.channel.ServerChannel;
|
||||||
|
import io.netty.channel.unix.FileDescriptor;
|
||||||
|
|
||||||
import java.net.InetSocketAddress;
|
import java.net.InetSocketAddress;
|
||||||
import java.net.SocketAddress;
|
import java.net.SocketAddress;
|
||||||
|
@ -28,10 +28,9 @@ import io.netty.channel.ChannelPipeline;
|
|||||||
import io.netty.channel.ChannelPromise;
|
import io.netty.channel.ChannelPromise;
|
||||||
import io.netty.channel.ConnectTimeoutException;
|
import io.netty.channel.ConnectTimeoutException;
|
||||||
import io.netty.channel.DefaultFileRegion;
|
import io.netty.channel.DefaultFileRegion;
|
||||||
import io.netty.channel.EventLoop;
|
|
||||||
import io.netty.channel.FileDescriptor;
|
|
||||||
import io.netty.channel.RecvByteBufAllocator;
|
import io.netty.channel.RecvByteBufAllocator;
|
||||||
import io.netty.channel.socket.ChannelInputShutdownEvent;
|
import io.netty.channel.socket.ChannelInputShutdownEvent;
|
||||||
|
import io.netty.channel.unix.FileDescriptor;
|
||||||
import io.netty.util.internal.PlatformDependent;
|
import io.netty.util.internal.PlatformDependent;
|
||||||
import io.netty.util.internal.StringUtil;
|
import io.netty.util.internal.StringUtil;
|
||||||
|
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
package io.netty.channel.epoll;
|
package io.netty.channel.epoll;
|
||||||
|
|
||||||
import io.netty.channel.ChannelOption;
|
import io.netty.channel.ChannelOption;
|
||||||
|
import io.netty.channel.unix.DomainSocketReadMode;
|
||||||
|
|
||||||
public final class EpollChannelOption {
|
public final class EpollChannelOption {
|
||||||
private static final Class<EpollChannelOption> T = EpollChannelOption.class;
|
private static final Class<EpollChannelOption> T = EpollChannelOption.class;
|
||||||
|
@ -25,11 +25,11 @@ import io.netty.channel.ChannelOutboundBuffer;
|
|||||||
import io.netty.channel.ChannelPipeline;
|
import io.netty.channel.ChannelPipeline;
|
||||||
import io.netty.channel.ChannelPromise;
|
import io.netty.channel.ChannelPromise;
|
||||||
import io.netty.channel.DefaultAddressedEnvelope;
|
import io.netty.channel.DefaultAddressedEnvelope;
|
||||||
import io.netty.channel.FileDescriptor;
|
|
||||||
import io.netty.channel.RecvByteBufAllocator;
|
import io.netty.channel.RecvByteBufAllocator;
|
||||||
import io.netty.channel.socket.DatagramChannel;
|
import io.netty.channel.socket.DatagramChannel;
|
||||||
import io.netty.channel.socket.DatagramChannelConfig;
|
import io.netty.channel.socket.DatagramChannelConfig;
|
||||||
import io.netty.channel.socket.DatagramPacket;
|
import io.netty.channel.socket.DatagramPacket;
|
||||||
|
import io.netty.channel.unix.FileDescriptor;
|
||||||
import io.netty.util.internal.PlatformDependent;
|
import io.netty.util.internal.PlatformDependent;
|
||||||
import io.netty.util.internal.StringUtil;
|
import io.netty.util.internal.StringUtil;
|
||||||
|
|
||||||
|
@ -19,11 +19,13 @@ import io.netty.channel.Channel;
|
|||||||
import io.netty.channel.ChannelConfig;
|
import io.netty.channel.ChannelConfig;
|
||||||
import io.netty.channel.ChannelOutboundBuffer;
|
import io.netty.channel.ChannelOutboundBuffer;
|
||||||
import io.netty.channel.ChannelPipeline;
|
import io.netty.channel.ChannelPipeline;
|
||||||
import io.netty.channel.FileDescriptor;
|
import io.netty.channel.unix.DomainSocketAddress;
|
||||||
|
import io.netty.channel.unix.DomainSocketChannel;
|
||||||
|
import io.netty.channel.unix.FileDescriptor;
|
||||||
|
|
||||||
import java.net.SocketAddress;
|
import java.net.SocketAddress;
|
||||||
|
|
||||||
public final class EpollDomainSocketChannel extends AbstractEpollStreamChannel {
|
public final class EpollDomainSocketChannel extends AbstractEpollStreamChannel implements DomainSocketChannel {
|
||||||
private final EpollDomainSocketChannelConfig config = new EpollDomainSocketChannelConfig(this);
|
private final EpollDomainSocketChannelConfig config = new EpollDomainSocketChannelConfig(this);
|
||||||
|
|
||||||
private volatile DomainSocketAddress local;
|
private volatile DomainSocketAddress local;
|
||||||
@ -107,7 +109,7 @@ public final class EpollDomainSocketChannel extends AbstractEpollStreamChannel {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Object filterOutboundMessage(Object msg) {
|
protected Object filterOutboundMessage(Object msg) {
|
||||||
if (msg instanceof NativeFileDescriptor) {
|
if (msg instanceof FileDescriptor) {
|
||||||
return msg;
|
return msg;
|
||||||
}
|
}
|
||||||
return super.filterOutboundMessage(msg);
|
return super.filterOutboundMessage(msg);
|
||||||
@ -150,7 +152,7 @@ public final class EpollDomainSocketChannel extends AbstractEpollStreamChannel {
|
|||||||
readPending = false;
|
readPending = false;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
pipeline.fireChannelRead(new NativeFileDescriptor(socketFd));
|
pipeline.fireChannelRead(new FileDescriptor(socketFd));
|
||||||
} catch (Throwable t) {
|
} catch (Throwable t) {
|
||||||
// keep on reading as we use epoll ET and need to consume everything from the socket
|
// keep on reading as we use epoll ET and need to consume everything from the socket
|
||||||
pipeline.fireChannelReadComplete();
|
pipeline.fireChannelReadComplete();
|
||||||
|
@ -21,10 +21,13 @@ import io.netty.channel.ChannelOption;
|
|||||||
import io.netty.channel.ChannelPipeline;
|
import io.netty.channel.ChannelPipeline;
|
||||||
import io.netty.channel.MessageSizeEstimator;
|
import io.netty.channel.MessageSizeEstimator;
|
||||||
import io.netty.channel.RecvByteBufAllocator;
|
import io.netty.channel.RecvByteBufAllocator;
|
||||||
|
import io.netty.channel.unix.DomainSocketChannelConfig;
|
||||||
|
import io.netty.channel.unix.DomainSocketReadMode;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
public final class EpollDomainSocketChannelConfig extends EpollChannelConfig {
|
public final class EpollDomainSocketChannelConfig extends EpollChannelConfig
|
||||||
|
implements DomainSocketChannelConfig {
|
||||||
private volatile DomainSocketReadMode mode =
|
private volatile DomainSocketReadMode mode =
|
||||||
DomainSocketReadMode.BYTES;
|
DomainSocketReadMode.BYTES;
|
||||||
|
|
||||||
@ -118,15 +121,7 @@ public final class EpollDomainSocketChannelConfig extends EpollChannelConfig {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
@Override
|
||||||
* Change the {@link DomainSocketReadMode} for the channel. The default is
|
|
||||||
* {@link DomainSocketReadMode#BYTES} which means bytes will be read from the
|
|
||||||
* {@link Channel} and passed through the pipeline. If
|
|
||||||
* {@link DomainSocketReadMode#FILE_DESCRIPTORS} is used
|
|
||||||
* {@link NativeFileDescriptor}s will be passed through the {@link ChannelPipeline}.
|
|
||||||
*
|
|
||||||
* This setting can be modified on the fly if needed.
|
|
||||||
*/
|
|
||||||
public EpollDomainSocketChannelConfig setReadMode(DomainSocketReadMode mode) {
|
public EpollDomainSocketChannelConfig setReadMode(DomainSocketReadMode mode) {
|
||||||
if (mode == null) {
|
if (mode == null) {
|
||||||
throw new NullPointerException("mode");
|
throw new NullPointerException("mode");
|
||||||
@ -135,9 +130,7 @@ public final class EpollDomainSocketChannelConfig extends EpollChannelConfig {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
@Override
|
||||||
* Return the {@link DomainSocketReadMode} for the channel.
|
|
||||||
*/
|
|
||||||
public DomainSocketReadMode getReadMode() {
|
public DomainSocketReadMode getReadMode() {
|
||||||
return mode;
|
return mode;
|
||||||
}
|
}
|
||||||
|
@ -16,7 +16,9 @@
|
|||||||
package io.netty.channel.epoll;
|
package io.netty.channel.epoll;
|
||||||
|
|
||||||
import io.netty.channel.Channel;
|
import io.netty.channel.Channel;
|
||||||
import io.netty.channel.FileDescriptor;
|
import io.netty.channel.unix.DomainSocketAddress;
|
||||||
|
import io.netty.channel.unix.FileDescriptor;
|
||||||
|
import io.netty.channel.unix.ServerDomainSocketChannel;
|
||||||
import io.netty.util.internal.logging.InternalLogger;
|
import io.netty.util.internal.logging.InternalLogger;
|
||||||
import io.netty.util.internal.logging.InternalLoggerFactory;
|
import io.netty.util.internal.logging.InternalLoggerFactory;
|
||||||
|
|
||||||
@ -24,7 +26,8 @@ import java.io.File;
|
|||||||
import java.net.SocketAddress;
|
import java.net.SocketAddress;
|
||||||
|
|
||||||
|
|
||||||
public final class EpollServerDomainSocketChannel extends AbstractEpollServerChannel {
|
public final class EpollServerDomainSocketChannel extends AbstractEpollServerChannel
|
||||||
|
implements ServerDomainSocketChannel {
|
||||||
private static final InternalLogger logger = InternalLoggerFactory.getInstance(
|
private static final InternalLogger logger = InternalLoggerFactory.getInstance(
|
||||||
EpollServerDomainSocketChannel.class);
|
EpollServerDomainSocketChannel.class);
|
||||||
|
|
||||||
|
@ -17,8 +17,8 @@ package io.netty.channel.epoll;
|
|||||||
|
|
||||||
import io.netty.channel.Channel;
|
import io.netty.channel.Channel;
|
||||||
import io.netty.channel.EventLoop;
|
import io.netty.channel.EventLoop;
|
||||||
import io.netty.channel.FileDescriptor;
|
|
||||||
import io.netty.channel.socket.ServerSocketChannel;
|
import io.netty.channel.socket.ServerSocketChannel;
|
||||||
|
import io.netty.channel.unix.FileDescriptor;
|
||||||
|
|
||||||
import java.net.InetSocketAddress;
|
import java.net.InetSocketAddress;
|
||||||
import java.net.SocketAddress;
|
import java.net.SocketAddress;
|
||||||
|
@ -19,9 +19,9 @@ import io.netty.channel.Channel;
|
|||||||
import io.netty.channel.ChannelFuture;
|
import io.netty.channel.ChannelFuture;
|
||||||
import io.netty.channel.ChannelPromise;
|
import io.netty.channel.ChannelPromise;
|
||||||
import io.netty.channel.EventLoop;
|
import io.netty.channel.EventLoop;
|
||||||
import io.netty.channel.FileDescriptor;
|
|
||||||
import io.netty.channel.socket.ServerSocketChannel;
|
import io.netty.channel.socket.ServerSocketChannel;
|
||||||
import io.netty.channel.socket.SocketChannel;
|
import io.netty.channel.socket.SocketChannel;
|
||||||
|
import io.netty.channel.unix.FileDescriptor;
|
||||||
import io.netty.util.concurrent.GlobalEventExecutor;
|
import io.netty.util.concurrent.GlobalEventExecutor;
|
||||||
import io.netty.util.internal.OneTimeTask;
|
import io.netty.util.internal.OneTimeTask;
|
||||||
|
|
||||||
|
@ -18,6 +18,7 @@ package io.netty.channel.epoll;
|
|||||||
|
|
||||||
import io.netty.channel.ChannelException;
|
import io.netty.channel.ChannelException;
|
||||||
import io.netty.channel.DefaultFileRegion;
|
import io.netty.channel.DefaultFileRegion;
|
||||||
|
import io.netty.channel.unix.DomainSocketAddress;
|
||||||
import io.netty.util.internal.EmptyArrays;
|
import io.netty.util.internal.EmptyArrays;
|
||||||
import io.netty.util.internal.NativeLibraryLoader;
|
import io.netty.util.internal.NativeLibraryLoader;
|
||||||
import io.netty.util.internal.PlatformDependent;
|
import io.netty.util.internal.PlatformDependent;
|
||||||
|
@ -13,11 +13,15 @@
|
|||||||
* License for the specific language governing permissions and limitations
|
* License for the specific language governing permissions and limitations
|
||||||
* under the License.
|
* under the License.
|
||||||
*/
|
*/
|
||||||
package io.netty.channel.epoll;
|
package io.netty.channel.unix;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.net.SocketAddress;
|
import java.net.SocketAddress;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A address for a
|
||||||
|
* <a href="http://en.wikipedia.org/wiki/Unix_domain_socket">Unix Domain Socket</a>.
|
||||||
|
*/
|
||||||
public final class DomainSocketAddress extends SocketAddress {
|
public final class DomainSocketAddress extends SocketAddress {
|
||||||
private final String socketPath;
|
private final String socketPath;
|
||||||
|
|
@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2015 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.channel.unix;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A {@link UnixChannel} that supports communication via
|
||||||
|
* <a href="http://en.wikipedia.org/wiki/Unix_domain_socket">Unix Domain Socket</a>.
|
||||||
|
*/
|
||||||
|
public interface DomainSocketChannel extends UnixChannel {
|
||||||
|
@Override
|
||||||
|
DomainSocketAddress remoteAddress();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
DomainSocketAddress localAddress();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
DomainSocketChannelConfig config();
|
||||||
|
}
|
@ -0,0 +1,70 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2015 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.channel.unix;
|
||||||
|
|
||||||
|
import io.netty.buffer.ByteBufAllocator;
|
||||||
|
import io.netty.channel.ChannelConfig;
|
||||||
|
import io.netty.channel.MessageSizeEstimator;
|
||||||
|
import io.netty.channel.RecvByteBufAllocator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Special {@link ChannelConfig} for {@link DomainSocketChannel}s.
|
||||||
|
*/
|
||||||
|
public interface DomainSocketChannelConfig extends ChannelConfig {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
DomainSocketChannelConfig setMaxMessagesPerRead(int maxMessagesPerRead);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
DomainSocketChannelConfig setConnectTimeoutMillis(int connectTimeoutMillis);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
DomainSocketChannelConfig setWriteSpinCount(int writeSpinCount);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
DomainSocketChannelConfig setAllocator(ByteBufAllocator allocator);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
DomainSocketChannelConfig setRecvByteBufAllocator(RecvByteBufAllocator allocator);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
DomainSocketChannelConfig setAutoRead(boolean autoRead);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
DomainSocketChannelConfig setWriteBufferHighWaterMark(int writeBufferHighWaterMark);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
DomainSocketChannelConfig setWriteBufferLowWaterMark(int writeBufferLowWaterMark);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
DomainSocketChannelConfig setMessageSizeEstimator(MessageSizeEstimator estimator);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Change the {@link DomainSocketReadMode} for the channel. The default is
|
||||||
|
* {@link DomainSocketReadMode#BYTES} which means bytes will be read from the
|
||||||
|
* {@link io.netty.channel.Channel} and passed through the pipeline. If
|
||||||
|
* {@link DomainSocketReadMode#FILE_DESCRIPTORS} is used
|
||||||
|
* {@link FileDescriptor}s will be passed through the {@link io.netty.channel.ChannelPipeline}.
|
||||||
|
*
|
||||||
|
* This setting can be modified on the fly if needed.
|
||||||
|
*/
|
||||||
|
DomainSocketChannelConfig setReadMode(DomainSocketReadMode mode);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the {@link DomainSocketReadMode} for the channel.
|
||||||
|
*/
|
||||||
|
DomainSocketReadMode getReadMode();
|
||||||
|
}
|
@ -13,17 +13,20 @@
|
|||||||
* License for the specific language governing permissions and limitations
|
* License for the specific language governing permissions and limitations
|
||||||
* under the License.
|
* under the License.
|
||||||
*/
|
*/
|
||||||
package io.netty.channel.epoll;
|
package io.netty.channel.unix;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Different modes of reading from a {@link DomainSocketChannel}.
|
||||||
|
*/
|
||||||
public enum DomainSocketReadMode {
|
public enum DomainSocketReadMode {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Read (@link ByteBuf)s from the {@link EpollSocketChannel}.
|
* Read (@link ByteBuf)s from the {@link DomainSocketChannel}.
|
||||||
*/
|
*/
|
||||||
BYTES,
|
BYTES,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Read (@link FileDscriptor)s from the {@link EpollSocketChannel}.
|
* Read (@link FileDscriptor)s from the {@link DomainSocketChannel}.
|
||||||
*/
|
*/
|
||||||
FILE_DESCRIPTORS
|
FILE_DESCRIPTORS
|
||||||
}
|
}
|
@ -13,9 +13,7 @@
|
|||||||
* License for the specific language governing permissions and limitations
|
* License for the specific language governing permissions and limitations
|
||||||
* under the License.
|
* under the License.
|
||||||
*/
|
*/
|
||||||
package io.netty.channel.epoll;
|
package io.netty.channel.unix;
|
||||||
|
|
||||||
import io.netty.channel.FileDescriptor;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
@ -23,25 +21,44 @@ import java.io.IOException;
|
|||||||
* Native {@link FileDescriptor} implementation which allows to wrap an {@code int} and provide a
|
* Native {@link FileDescriptor} implementation which allows to wrap an {@code int} and provide a
|
||||||
* {@link FileDescriptor} for it.
|
* {@link FileDescriptor} for it.
|
||||||
*/
|
*/
|
||||||
public final class NativeFileDescriptor implements FileDescriptor {
|
public class FileDescriptor {
|
||||||
|
|
||||||
private final int fd;
|
private final int fd;
|
||||||
|
|
||||||
public NativeFileDescriptor(int fd) {
|
public FileDescriptor(int fd) {
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
throw new IllegalArgumentException("fd must be >= 0");
|
throw new IllegalArgumentException("fd must be >= 0");
|
||||||
}
|
}
|
||||||
this.fd = fd;
|
this.fd = fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
/**
|
||||||
|
* An invalid file descriptor which was closed before.
|
||||||
|
*/
|
||||||
|
public static final FileDescriptor INVALID = new FileDescriptor(0) {
|
||||||
|
@Override
|
||||||
|
public int intValue() {
|
||||||
|
throw new IllegalStateException("invalid file descriptor");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() {
|
||||||
|
// NOOP
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the int value of the filedescriptor.
|
||||||
|
*/
|
||||||
public int intValue() {
|
public int intValue() {
|
||||||
return fd;
|
return fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
/**
|
||||||
|
* Close the file descriptor.
|
||||||
|
*/
|
||||||
public void close() throws IOException {
|
public void close() throws IOException {
|
||||||
Native.close(fd);
|
close(fd);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -56,15 +73,17 @@ public final class NativeFileDescriptor implements FileDescriptor {
|
|||||||
if (this == o) {
|
if (this == o) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (!(o instanceof NativeFileDescriptor)) {
|
if (!(o instanceof FileDescriptor)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return fd == ((NativeFileDescriptor) o).fd;
|
return fd == ((FileDescriptor) o).fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
return fd;
|
return fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static native int close(int fd);
|
||||||
}
|
}
|
@ -0,0 +1,30 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2015 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.channel.unix;
|
||||||
|
|
||||||
|
import io.netty.channel.ServerChannel;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@link ServerChannel} that accepts {@link DomainSocketChannel}'s via
|
||||||
|
* <a href="http://en.wikipedia.org/wiki/Unix_domain_socket">Unix Domain Socket</a>.
|
||||||
|
*/
|
||||||
|
public interface ServerDomainSocketChannel extends ServerChannel, UnixChannel {
|
||||||
|
@Override
|
||||||
|
DomainSocketAddress remoteAddress();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
DomainSocketAddress localAddress();
|
||||||
|
}
|
@ -13,34 +13,16 @@
|
|||||||
* License for the specific language governing permissions and limitations
|
* License for the specific language governing permissions and limitations
|
||||||
* under the License.
|
* under the License.
|
||||||
*/
|
*/
|
||||||
package io.netty.channel;
|
package io.netty.channel.unix;
|
||||||
|
|
||||||
import java.io.IOException;
|
import io.netty.channel.Channel;
|
||||||
|
|
||||||
public interface FileDescriptor {
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@link Channel} that expose operations that are only present on {@code UNIX} like systems.
|
||||||
|
*/
|
||||||
|
public interface UnixChannel extends Channel {
|
||||||
/**
|
/**
|
||||||
* An invalid file descriptor which was closed before.
|
* Returns the {@link FileDescriptor} that is used by this {@link Channel}.
|
||||||
*/
|
*/
|
||||||
FileDescriptor INVALID = new FileDescriptor() {
|
FileDescriptor fd();
|
||||||
@Override
|
|
||||||
public int intValue() {
|
|
||||||
throw new IllegalStateException("invalid file descriptor");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void close() {
|
|
||||||
// NOOP
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return the int value of the filedescriptor.
|
|
||||||
*/
|
|
||||||
int intValue();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Close the file descriptor.
|
|
||||||
*/
|
|
||||||
void close() throws IOException;
|
|
||||||
}
|
}
|
@ -0,0 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2014 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unix specific transport.
|
||||||
|
*/
|
||||||
|
package io.netty.channel.unix;
|
@ -22,6 +22,8 @@ import io.netty.channel.ChannelFuture;
|
|||||||
import io.netty.channel.ChannelFutureListener;
|
import io.netty.channel.ChannelFutureListener;
|
||||||
import io.netty.channel.ChannelHandlerContext;
|
import io.netty.channel.ChannelHandlerContext;
|
||||||
import io.netty.channel.ChannelInboundHandlerAdapter;
|
import io.netty.channel.ChannelInboundHandlerAdapter;
|
||||||
|
import io.netty.channel.unix.DomainSocketReadMode;
|
||||||
|
import io.netty.channel.unix.FileDescriptor;
|
||||||
import io.netty.testsuite.transport.TestsuitePermutation;
|
import io.netty.testsuite.transport.TestsuitePermutation;
|
||||||
import io.netty.testsuite.transport.socket.AbstractSocketTest;
|
import io.netty.testsuite.transport.socket.AbstractSocketTest;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
@ -71,7 +73,7 @@ public class EpollDomainSocketFdTest extends AbstractSocketTest {
|
|||||||
cb.handler(new ChannelInboundHandlerAdapter() {
|
cb.handler(new ChannelInboundHandlerAdapter() {
|
||||||
@Override
|
@Override
|
||||||
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
|
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
|
||||||
NativeFileDescriptor fd = (NativeFileDescriptor) msg;
|
FileDescriptor fd = (FileDescriptor) msg;
|
||||||
queue.offer(fd);
|
queue.offer(fd);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -90,9 +92,9 @@ public class EpollDomainSocketFdTest extends AbstractSocketTest {
|
|||||||
cc.close().sync();
|
cc.close().sync();
|
||||||
sc.close().sync();
|
sc.close().sync();
|
||||||
|
|
||||||
if (received instanceof NativeFileDescriptor) {
|
if (received instanceof FileDescriptor) {
|
||||||
Assert.assertNotSame(NativeFileDescriptor.INVALID, received);
|
Assert.assertNotSame(FileDescriptor.INVALID, received);
|
||||||
((NativeFileDescriptor) received).close();
|
((FileDescriptor) received).close();
|
||||||
Assert.assertNull(queue.poll());
|
Assert.assertNull(queue.poll());
|
||||||
} else {
|
} else {
|
||||||
throw (Throwable) received;
|
throw (Throwable) received;
|
||||||
|
@ -24,6 +24,7 @@ import io.netty.channel.socket.InternetProtocolFamily;
|
|||||||
import io.netty.channel.socket.nio.NioDatagramChannel;
|
import io.netty.channel.socket.nio.NioDatagramChannel;
|
||||||
import io.netty.channel.socket.nio.NioServerSocketChannel;
|
import io.netty.channel.socket.nio.NioServerSocketChannel;
|
||||||
import io.netty.channel.socket.nio.NioSocketChannel;
|
import io.netty.channel.socket.nio.NioSocketChannel;
|
||||||
|
import io.netty.channel.unix.DomainSocketAddress;
|
||||||
import io.netty.testsuite.transport.TestsuitePermutation;
|
import io.netty.testsuite.transport.TestsuitePermutation;
|
||||||
import io.netty.testsuite.transport.TestsuitePermutation.BootstrapFactory;
|
import io.netty.testsuite.transport.TestsuitePermutation.BootstrapFactory;
|
||||||
import io.netty.testsuite.transport.socket.SocketTestPermutation;
|
import io.netty.testsuite.transport.socket.SocketTestPermutation;
|
||||||
|
Loading…
Reference in New Issue
Block a user