From 2ba9f824c23fe8415fe36c3bc046047df1e8a163 Mon Sep 17 00:00:00 2001 From: Norman Maurer Date: Wed, 10 Sep 2014 14:30:58 +0200 Subject: [PATCH] Directly write CompositeByteBuf if possible without memory copy. Related to [#2719] Motivation: In linux it is possible to write more then one buffer withone syscall when sending datagram messages. Modifications: Not copy CompositeByteBuf if it only contains direct buffers. Result: More performance due less overhead for copy. --- .../java/io/netty/channel/epoll/EpollDatagramChannel.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/transport-native-epoll/src/main/java/io/netty/channel/epoll/EpollDatagramChannel.java b/transport-native-epoll/src/main/java/io/netty/channel/epoll/EpollDatagramChannel.java index cce15678c8..3cf23eda92 100644 --- a/transport-native-epoll/src/main/java/io/netty/channel/epoll/EpollDatagramChannel.java +++ b/transport-native-epoll/src/main/java/io/netty/channel/epoll/EpollDatagramChannel.java @@ -372,6 +372,14 @@ public final class EpollDatagramChannel extends AbstractEpollChannel implements return msg; } + if (content.isDirect() && content instanceof CompositeByteBuf) { + // Special handling of CompositeByteBuf to reduce memory copies if some of the Components + // in the CompositeByteBuf are backed by a memoryAddress. + CompositeByteBuf comp = (CompositeByteBuf) content; + if (comp.isDirect() && comp.nioBufferCount() <= Native.IOV_MAX) { + return msg; + } + } // We can only handle direct buffers so we need to copy if a non direct is // passed to write. return new DatagramPacket(newDirectBuffer(packet, content), packet.recipient());