1 /* VMChannel.java -- Native interface suppling channel operations. 2 Copyright (C) 2006 Free Software Foundation, Inc. 3 4 This file is part of GNU Classpath. 5 6 GNU Classpath is free software; you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation; either version 2, or (at your option) 9 any later version. 10 11 GNU Classpath is distributed in the hope that it will be useful, but 12 WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 General Public License for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with GNU Classpath; see the file COPYING. If not, write to the 18 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 19 02110-1301 USA. 20 21 Linking this library statically or dynamically with other modules is 22 making a combined work based on this library. Thus, the terms and 23 conditions of the GNU General Public License cover the whole 24 combination. 25 26 As a special exception, the copyright holders of this library give you 27 permission to link this library with independent modules to produce an 28 executable, regardless of the license terms of these independent 29 modules, and to copy and distribute the resulting executable under 30 terms of your choice, provided that you also meet, for each linked 31 independent module, the terms and conditions of the license of that 32 module. An independent module is a module which is not derived from 33 or based on this library. If you modify this library, you may extend 34 this exception to your version of the library, but you are not 35 obligated to do so. If you do not wish to do so, delete this 36 exception statement from your version. */ 37 38 39 package gnu.java.nio; 40 41 import gnu.classpath.Configuration; 42 import gnu.java.net.PlainSocketImpl; 43 import gnu.java.nio.PipeImpl.SinkChannelImpl; 44 import gnu.java.nio.PipeImpl.SourceChannelImpl; 45 import gnu.java.nio.channels.FileChannelImpl; 46 47 import java.io.IOException; 48 import java.nio.ByteBuffer; 49 50 /** 51 * Native interface to support configuring of channel to run in a non-blocking 52 * manner and support scatter/gather io operations. 53 * 54 * @author Michael Barker <mike@middlesoft.co.uk> 55 * 56 */ 57 public class VMChannel 58 { 59 private final int fd; 60 VMChannel(int fd)61 private VMChannel(int fd) 62 { 63 this.fd = fd; 64 } 65 getVMChannel(PlainSocketImpl socket)66 public static VMChannel getVMChannel(PlainSocketImpl socket) 67 { 68 return new VMChannel(socket.getNativeFD()); 69 } 70 getVMChannel(SourceChannelImpl source)71 public static VMChannel getVMChannel(SourceChannelImpl source) 72 { 73 return new VMChannel(source.getNativeFD()); 74 } 75 getVMChannel(SinkChannelImpl sink)76 public static VMChannel getVMChannel(SinkChannelImpl sink) 77 { 78 return new VMChannel(sink.getNativeFD()); 79 } 80 getVMChannel(FileChannelImpl file)81 public static VMChannel getVMChannel(FileChannelImpl file) 82 { 83 return new VMChannel(file.getNativeFD()); 84 } 85 86 static 87 { 88 // load the shared library needed for native methods. 89 if (Configuration.INIT_LOAD_LIBRARY) 90 { 91 System.loadLibrary ("javanio"); 92 } initIDs()93 initIDs(); 94 } 95 96 /** 97 * Set the file descriptor to have the required blocking 98 * setting. 99 * 100 * @param fd 101 * @param blocking 102 */ setBlocking(int fd, boolean blocking)103 public native void setBlocking(int fd, boolean blocking); 104 setBlocking(boolean blocking)105 public void setBlocking(boolean blocking) 106 { 107 setBlocking(fd, blocking); 108 } 109 110 111 /** 112 * Reads a byte buffer directly using the supplied file descriptor. 113 * Assumes that the buffer is a DirectBuffer. 114 * 115 * @param fd Native file descriptor to read from. 116 * @param dst Direct Byte Buffer to read to. 117 * @return Number of bytes read. 118 * @throws IOException If an error occurs or dst is not a direct buffers. 119 */ read(int fd, ByteBuffer dst)120 native int read(int fd, ByteBuffer dst) 121 throws IOException; 122 read(ByteBuffer dst)123 public int read(ByteBuffer dst) 124 throws IOException 125 { 126 return read(fd, dst); 127 } 128 129 /** 130 * Reads into byte buffers directly using the supplied file descriptor. 131 * Assumes that the buffer list contains DirectBuffers. Will perform a 132 * scattering read. 133 * 134 * @param fd Native file descriptor to read from. 135 * @param dsts An array direct byte buffers. 136 * @param offset Index of the first buffer to read to. 137 * @param length The number of buffers to read to. 138 * @return Number of bytes read. 139 * @throws IOException If an error occurs or the dsts are not direct buffers. 140 */ readScattering(int fd, ByteBuffer[] dsts, int offset, int length)141 native long readScattering(int fd, ByteBuffer[] dsts, int offset, int length) 142 throws IOException; 143 readScattering(ByteBuffer[] dsts, int offset, int length)144 public long readScattering(ByteBuffer[] dsts, int offset, int length) 145 throws IOException 146 { 147 if (offset + length > dsts.length) 148 throw new IndexOutOfBoundsException("offset + length > dsts.length"); 149 150 return readScattering(fd, dsts, offset, length); 151 } 152 153 /** 154 * Writes from a direct byte bufer using the supplied file descriptor. 155 * Assumes the buffer is a DirectBuffer. 156 * 157 * @param fd 158 * @param src 159 * @return Number of bytes written. 160 * @throws IOException 161 */ write(int fd, ByteBuffer src)162 native int write(int fd, ByteBuffer src) 163 throws IOException; 164 write(ByteBuffer src)165 public int write(ByteBuffer src) 166 throws IOException 167 { 168 return write(fd, src); 169 } 170 171 /** 172 * Writes from byte buffers directly using the supplied file descriptor. 173 * Assumes the that buffer list constains DirectBuffers. Will perform 174 * as gathering write. 175 * 176 * @param fd 177 * @param srcs 178 * @param offset 179 * @param length 180 * @return Number of bytes written. 181 * @throws IOException 182 */ writeGathering(int fd, ByteBuffer[] srcs, int offset, int length)183 native long writeGathering(int fd, ByteBuffer[] srcs, int offset, int length) 184 throws IOException; 185 writeGathering(ByteBuffer[] srcs, int offset, int length)186 public long writeGathering(ByteBuffer[] srcs, int offset, int length) 187 throws IOException 188 { 189 if (offset + length > srcs.length) 190 throw new IndexOutOfBoundsException("offset + length > srcs.length"); 191 192 return writeGathering(fd, srcs, offset, length); 193 } 194 initIDs()195 private native static void initIDs(); 196 197 } 198