package org.limewire.nio; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.ReadableByteChannel; import java.nio.channels.SocketChannel; import org.limewire.nio.channel.InterestScatteringByteChannel; /** * Adapter that forwards InterestReadChannel.interest(..) * calls on to NIODispatcher. All ReadableByteChannel * calls are delegated to the SocketChannel. */ class SocketInterestReadAdapter implements InterestScatteringByteChannel { /** Mask OOM as this exception */ private static final IOException OOM = new IOException("Out Of Memory"); /** the SocketChannel this is proxying. */ private SocketChannel channel; SocketInterestReadAdapter(SocketChannel channel) { this.channel = channel; } public void interestRead(boolean status) { NIODispatcher.instance().interestRead(channel, status); } public int read(ByteBuffer dst) throws IOException { try { return channel.read(dst); } catch (OutOfMemoryError oom) { // gc-ing will stall the NIODispatcher thread // but otherwise masking the oom is not very helpful System.gc(); throw OOM; } } public boolean isOpen() { return channel.isOpen(); } public void close() throws IOException { channel.close(); } ReadableByteChannel getChannel() { return channel; } public long read(ByteBuffer[] dsts, int offset, int length) throws IOException { return channel.read(dsts, offset, length); } public long read(ByteBuffer[] dsts) throws IOException { return channel.read(dsts); } @Override public String toString() { return "SocketInterestReadAdapter: " + channel; } }