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
26package sun.nio.ch;
27
28import java.io.FileDescriptor;
29import java.io.IOException;
30import jdk.internal.misc.SharedSecrets;
31import jdk.internal.misc.JavaIOFileDescriptorAccess;
32import sun.security.action.GetPropertyAction;
33
34class 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);
53    }
54
55    int pread(FileDescriptor fd, long address, int len, long position)
56        throws IOException
57    {
58        return pread0(fd, address, len, position);
59    }
60
61    long readv(FileDescriptor fd, long address, int len) throws IOException {
62        return readv0(fd, address, len);
63    }
64
65    int write(FileDescriptor fd, long address, int len) throws IOException {
66        return write0(fd, address, len, fdAccess.getAppend(fd));
67    }
68
69    int pwrite(FileDescriptor fd, long address, int len, long position)
70        throws IOException
71    {
72        return pwrite0(fd, address, len, position);
73    }
74
75    long writev(FileDescriptor fd, long address, int len) throws IOException {
76        return writev0(fd, address, len, fdAccess.getAppend(fd));
77    }
78
79    int force(FileDescriptor fd, boolean metaData) throws IOException {
80        return force0(fd, metaData);
81    }
82
83    int truncate(FileDescriptor fd, long size) throws IOException {
84        return truncate0(fd, size);
85    }
86
87    int allocate(FileDescriptor fd, long size) throws IOException {
88        // truncate0() works for extending and truncating file size
89        return truncate0(fd, size);
90    }
91
92    long size(FileDescriptor fd) throws IOException {
93        return size0(fd);
94    }
95
96    int lock(FileDescriptor fd, boolean blocking, long pos, long size,
97             boolean shared) throws IOException
98    {
99        return lock0(fd, blocking, pos, size, shared);
100    }
101
102    void release(FileDescriptor fd, long pos, long size) throws IOException {
103        release0(fd, pos, size);
104    }
105
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)
146        throws IOException;
147
148    static native int pread0(FileDescriptor fd, long address, int len,
149                             long position) throws IOException;
150
151    static native long readv0(FileDescriptor fd, long address, int len)
152        throws IOException;
153
154    static native int write0(FileDescriptor fd, long address, int len, boolean append)
155        throws IOException;
156
157    static native int pwrite0(FileDescriptor fd, long address, int len,
158                             long position) throws IOException;
159
160    static native long writev0(FileDescriptor fd, long address, int len, boolean append)
161        throws IOException;
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 long duplicateHandle(long fd) throws IOException;
180}
181