1 /*
2 * Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package sun.nio.ch;
27
28 import java.io.FileDescriptor;
29 import java.io.IOException;
30 import jdk.internal.misc.SharedSecrets;
31 import jdk.internal.misc.JavaIOFileDescriptorAccess;
32 import sun.security.action.GetPropertyAction;
33
34 class FileDispatcherImpl extends FileDispatcher {
35
36 private static final JavaIOFileDescriptorAccess fdAccess =
37 SharedSecrets.getJavaIOFileDescriptorAccess();
38
39 // set to true if fast file transmission (TransmitFile) is enabled
40 private static final boolean fastFileTransfer;
41
42 FileDispatcherImpl() { }
43
44 @Override
45 boolean needsPositionLock() {
46 return true;
47 }
48
49 int read(FileDescriptor fd, long address, int len)
50 throws IOException
51 {
52 return read0(fd, address, len);
106 void close(FileDescriptor fd) throws IOException {
107 close0(fd);
108 }
109
110 FileDescriptor duplicateForMapping(FileDescriptor fd) throws IOException {
111 // on Windows we need to keep a handle to the file
112 FileDescriptor result = new FileDescriptor();
113 long handle = duplicateHandle(fdAccess.getHandle(fd));
114 fdAccess.setHandle(result, handle);
115 return result;
116 }
117
118 boolean canTransferToDirectly(java.nio.channels.SelectableChannel sc) {
119 return fastFileTransfer && sc.isBlocking();
120 }
121
122 boolean transferToDirectlyNeedsPositionLock() {
123 return true;
124 }
125
126 static boolean isFastFileTransferRequested() {
127 String fileTransferProp = GetPropertyAction
128 .privilegedGetProperty("jdk.nio.enableFastFileTransfer");
129 boolean enable;
130 if ("".equals(fileTransferProp)) {
131 enable = true;
132 } else {
133 enable = Boolean.parseBoolean(fileTransferProp);
134 }
135 return enable;
136 }
137
138 static {
139 IOUtil.load();
140 fastFileTransfer = isFastFileTransferRequested();
141 }
142
143 //-- Native methods
144
145 static native int read0(FileDescriptor fd, long address, int len)
162
163 static native int force0(FileDescriptor fd, boolean metaData)
164 throws IOException;
165
166 static native int truncate0(FileDescriptor fd, long size)
167 throws IOException;
168
169 static native long size0(FileDescriptor fd) throws IOException;
170
171 static native int lock0(FileDescriptor fd, boolean blocking, long pos,
172 long size, boolean shared) throws IOException;
173
174 static native void release0(FileDescriptor fd, long pos, long size)
175 throws IOException;
176
177 static native void close0(FileDescriptor fd) throws IOException;
178
179 static native void closeByHandle(long fd) throws IOException;
180
181 static native long duplicateHandle(long fd) throws IOException;
182 }
|
1 /*
2 * Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package sun.nio.ch;
27
28 import java.io.FileDescriptor;
29 import java.io.IOException;
30 import jdk.internal.misc.SharedSecrets;
31 import jdk.internal.misc.JavaIOFileDescriptorAccess;
32 import sun.security.action.GetPropertyAction;
33 import java.io.File;
34 import java.nio.CharBuffer;
35
36 class FileDispatcherImpl extends FileDispatcher {
37
38 private static final JavaIOFileDescriptorAccess fdAccess =
39 SharedSecrets.getJavaIOFileDescriptorAccess();
40
41 // set to true if fast file transmission (TransmitFile) is enabled
42 private static final boolean fastFileTransfer;
43
44 FileDispatcherImpl() { }
45
46 @Override
47 boolean needsPositionLock() {
48 return true;
49 }
50
51 int read(FileDescriptor fd, long address, int len)
52 throws IOException
53 {
54 return read0(fd, address, len);
108 void close(FileDescriptor fd) throws IOException {
109 close0(fd);
110 }
111
112 FileDescriptor duplicateForMapping(FileDescriptor fd) throws IOException {
113 // on Windows we need to keep a handle to the file
114 FileDescriptor result = new FileDescriptor();
115 long handle = duplicateHandle(fdAccess.getHandle(fd));
116 fdAccess.setHandle(result, handle);
117 return result;
118 }
119
120 boolean canTransferToDirectly(java.nio.channels.SelectableChannel sc) {
121 return fastFileTransfer && sc.isBlocking();
122 }
123
124 boolean transferToDirectlyNeedsPositionLock() {
125 return true;
126 }
127
128 int setDirectIO(FileDescriptor fd, String path)
129 {
130 int result = -1;
131 String filePath = path.substring(0, path.lastIndexOf(File.separator));
132 CharBuffer buffer = CharBuffer.allocate(filePath.length());
133 buffer.put(filePath);
134 try {
135 result = setDirect0(buffer);
136 } catch (IOException e) {
137 throw new UnsupportedOperationException
138 ("Error setting up DirectIO", e);
139 }
140 return result;
141 }
142
143 static boolean isFastFileTransferRequested() {
144 String fileTransferProp = GetPropertyAction
145 .privilegedGetProperty("jdk.nio.enableFastFileTransfer");
146 boolean enable;
147 if ("".equals(fileTransferProp)) {
148 enable = true;
149 } else {
150 enable = Boolean.parseBoolean(fileTransferProp);
151 }
152 return enable;
153 }
154
155 static {
156 IOUtil.load();
157 fastFileTransfer = isFastFileTransferRequested();
158 }
159
160 //-- Native methods
161
162 static native int read0(FileDescriptor fd, long address, int len)
179
180 static native int force0(FileDescriptor fd, boolean metaData)
181 throws IOException;
182
183 static native int truncate0(FileDescriptor fd, long size)
184 throws IOException;
185
186 static native long size0(FileDescriptor fd) throws IOException;
187
188 static native int lock0(FileDescriptor fd, boolean blocking, long pos,
189 long size, boolean shared) throws IOException;
190
191 static native void release0(FileDescriptor fd, long pos, long size)
192 throws IOException;
193
194 static native void close0(FileDescriptor fd) throws IOException;
195
196 static native void closeByHandle(long fd) throws IOException;
197
198 static native long duplicateHandle(long fd) throws IOException;
199
200 static native int setDirect0(CharBuffer buffer) throws IOException;
201 }
|