/* * Written by Fedor Burdun of Azul Systems, and released to the public domain, * as explained at http://creativecommons.org/publicdomain/zero/1.0/ * */ package org.jrt.socket.nio; import org.jrt.impl.JRT; import org.jrt.socket.regular.Accumulator; import org.jrt.socket.regular.JavaNetSocketCodeWrapper; /** * * @author fijiol */ public class NioSocketCodeWrapper extends JavaNetSocketCodeWrapper { @Override public void init(JRT jRT) { super.init(jRT); } @Override public boolean needInstrument(String className) { return className != null && ( className.equals("sun/nio/ch/IOUtil") || className.equals("sun/nio/ch/SocketChannelImpl") || className.equals("sun/nio/ch/AsynchronousSocketChannelImpl") || false ); } @Override public String postCode(String methodName) { if (methodName.equals("sun.nio.ch.SocketChannelImpl(java.nio.channels.spi.SelectorProvider,java.io.FileDescriptor,java.net.InetSocketAddress)")) { return _block( //ENSURE that fd everywhere can be get! Accumulator._filter(_jRT(), "fd", "remoteAddress.getAddress()", "remoteAddress.getPort()", "localAddress.getPort()") ); } if (methodName.equals("sun.nio.ch.SocketChannelImpl.connect(java.net.SocketAddress)")) { return _block( //ENSURE that fd everywhere can be get! Accumulator._filter(_jRT(), "fd", "((java.net.InetSocketAddress)$1).getAddress()", "((java.net.InetSocketAddress)$1).getPort()", "0") ); } if (methodName.equals("sun.nio.ch.AsynchronousSocketChannelImpl(sun.nio.ch.AsynchronousChannelGroupImpl,java.io.FileDescriptor,java.net.InetSocketAddress)")) { return _block( //ENSURE that fd everywhere can be get! Accumulator._filter(_jRT(), "fd", "remoteAddress.getAddress()", "remoteAddress.getPort()", "localAddress.getPort()") ); } if (methodName.equals("sun.nio.ch.AsynchronousSocketChannelImpl.connect(java.net.SocketAddress)")) { return _block( //ENSURE that fd everywhere can be get! Accumulator._filter(_jRT(), "fd", "((java.net.InetSocketAddress)$1).getAddress()", "((java.net.InetSocketAddress)$1).getPort()", "0") ); } if (methodName.equals("sun.nio.ch.AsynchronousSocketChannelImpl.connect(java.net.SocketAddress,java.lang.Object,java.nio.channels.CompletionHandler)")) { return _block( //ENSURE that fd everywhere can be get! Accumulator._filter(_jRT(), "fd", "((java.net.InetSocketAddress)$1).getAddress()", "((java.net.InetSocketAddress)$1).getPort()", "0") ); } if (methodName.contains("sun.nio.ch.IOUtil.read(java.io.FileDescriptor,")) { return _debugWraps( Accumulator._readAfter(_jRT(), _ioHic()) ); } if (methodName.contains("sun.nio.ch.IOUtil.write(java.io.FileDescriptor,")) { return _debugWraps( Accumulator._writeAfter(_jRT(), _ioHic()) ); } return null; } @Override public String preCode(String methodName) { if (methodName == null) { return null; } if (methodName.contains("sun.nio.ch.IOUtil.read(java.io.FileDescriptor,")) { return _debugWraps( Accumulator._readBefore(_jRT(), _ioHic()) ); } if (methodName.contains("sun.nio.ch.IOUtil.write(java.io.FileDescriptor,")) { return _debugWraps( Accumulator._writeBefore(_jRT(), _ioHic()) ); } return null; } @Override public String _ioHic() { // return _jRT() + ".sockRTs.get(fd)"; // <-- Expected fd ~ $1 // Code below is correct, because we used it only while redefine read/write functions that get FileDescriptor as first argument return _jRT() + ".sockRTs.get($1)"; } }