/*
* Copyright 2014-2017 Real Logic Ltd.
*
* Licensed 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.aeron.samples.raw;
import io.aeron.driver.Configuration;
import org.agrona.nio.NioSelectedKeySet;
import org.agrona.IoUtil;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Field;
import java.net.InetSocketAddress;
import java.net.StandardSocketOptions;
import java.nio.channels.DatagramChannel;
import java.nio.channels.FileChannel;
import java.nio.channels.Selector;
import static java.nio.file.StandardOpenOption.CREATE;
import static java.nio.file.StandardOpenOption.READ;
import static java.nio.file.StandardOpenOption.WRITE;
public class Common
{
public static final int NUM_MESSAGES = 10_000;
public static final int PONG_PORT = 40123;
public static final int PING_PORT = 50123;
static final Field SELECTED_KEYS_FIELD;
static final Field PUBLIC_SELECTED_KEYS_FIELD;
static
{
Field selectKeysField = null;
Field publicSelectKeysField = null;
try
{
final Class<?> clazz = Class.forName("sun.nio.ch.SelectorImpl", false, ClassLoader.getSystemClassLoader());
if (clazz.isAssignableFrom(Selector.open().getClass()))
{
selectKeysField = clazz.getDeclaredField("selectedKeys");
selectKeysField.setAccessible(true);
publicSelectKeysField = clazz.getDeclaredField("publicSelectedKeys");
publicSelectKeysField.setAccessible(true);
}
}
catch (final Exception ignore)
{
}
SELECTED_KEYS_FIELD = selectKeysField;
PUBLIC_SELECTED_KEYS_FIELD = publicSelectKeysField;
}
public static void init(final DatagramChannel channel) throws IOException
{
channel.configureBlocking(false);
channel.setOption(StandardSocketOptions.SO_REUSEADDR, true);
}
public static void init(final DatagramChannel channel, final InetSocketAddress sendAddress)
throws IOException
{
channel.configureBlocking(false);
channel.setOption(StandardSocketOptions.SO_REUSEADDR, true);
channel.connect(sendAddress);
}
public static NioSelectedKeySet keySet(final Selector selector)
{
NioSelectedKeySet tmpSet = null;
if (null != PUBLIC_SELECTED_KEYS_FIELD)
{
try
{
tmpSet = new NioSelectedKeySet();
SELECTED_KEYS_FIELD.set(selector, tmpSet);
PUBLIC_SELECTED_KEYS_FIELD.set(selector, tmpSet);
}
catch (final Exception ignore)
{
tmpSet = null;
}
}
return tmpSet;
}
public static FileChannel createTmpFileChannel() throws IOException
{
final File file = File.createTempFile("buffer-", ".dat");
file.deleteOnExit();
final FileChannel fileChannel = FileChannel.open(file.toPath(), CREATE, READ, WRITE);
IoUtil.fill(fileChannel, 0, Configuration.MTU_LENGTH_DEFAULT, (byte)0);
return fileChannel;
}
}