提交 a0a4dbca 编写于 作者: L lana

Merge

...@@ -110,6 +110,8 @@ SUNWprivate_1.1 { ...@@ -110,6 +110,8 @@ SUNWprivate_1.1 {
NET_Bind; NET_Bind;
NET_MapSocketOption; NET_MapSocketOption;
NET_Wait; NET_Wait;
NET_EnableFastTcpLoopback;
NET_ThrowNew;
ipv6_available; ipv6_available;
local: local:
......
...@@ -38,6 +38,7 @@ import java.nio.channels.NonReadableChannelException; ...@@ -38,6 +38,7 @@ import java.nio.channels.NonReadableChannelException;
import java.nio.channels.NonWritableChannelException; import java.nio.channels.NonWritableChannelException;
import java.nio.channels.OverlappingFileLockException; import java.nio.channels.OverlappingFileLockException;
import java.nio.channels.ReadableByteChannel; import java.nio.channels.ReadableByteChannel;
import java.nio.channels.SelectableChannel;
import java.nio.channels.WritableByteChannel; import java.nio.channels.WritableByteChannel;
import java.security.AccessController; import java.security.AccessController;
import java.util.ArrayList; import java.util.ArrayList;
...@@ -407,30 +408,13 @@ public class FileChannelImpl ...@@ -407,30 +408,13 @@ public class FileChannelImpl
// //
private static volatile boolean fileSupported = true; private static volatile boolean fileSupported = true;
private long transferToDirectly(long position, int icount, private long transferToDirectlyInternal(long position, int icount,
WritableByteChannel target) WritableByteChannel target,
FileDescriptor targetFD)
throws IOException throws IOException
{ {
if (!transferSupported) assert !nd.transferToDirectlyNeedsPositionLock() ||
return IOStatus.UNSUPPORTED; Thread.holdsLock(positionLock);
FileDescriptor targetFD = null;
if (target instanceof FileChannelImpl) {
if (!fileSupported)
return IOStatus.UNSUPPORTED_CASE;
targetFD = ((FileChannelImpl)target).fd;
} else if (target instanceof SelChImpl) {
// Direct transfer to pipe causes EINVAL on some configurations
if ((target instanceof SinkChannelImpl) && !pipeSupported)
return IOStatus.UNSUPPORTED_CASE;
targetFD = ((SelChImpl)target).getFD();
}
if (targetFD == null)
return IOStatus.UNSUPPORTED;
int thisFDVal = IOUtil.fdVal(fd);
int targetFDVal = IOUtil.fdVal(targetFD);
if (thisFDVal == targetFDVal) // Not supported on some configurations
return IOStatus.UNSUPPORTED;
long n = -1; long n = -1;
int ti = -1; int ti = -1;
...@@ -440,7 +424,7 @@ public class FileChannelImpl ...@@ -440,7 +424,7 @@ public class FileChannelImpl
if (!isOpen()) if (!isOpen())
return -1; return -1;
do { do {
n = transferTo0(thisFDVal, position, icount, targetFDVal); n = transferTo0(fd, position, icount, targetFD);
} while ((n == IOStatus.INTERRUPTED) && isOpen()); } while ((n == IOStatus.INTERRUPTED) && isOpen());
if (n == IOStatus.UNSUPPORTED_CASE) { if (n == IOStatus.UNSUPPORTED_CASE) {
if (target instanceof SinkChannelImpl) if (target instanceof SinkChannelImpl)
...@@ -461,6 +445,54 @@ public class FileChannelImpl ...@@ -461,6 +445,54 @@ public class FileChannelImpl
} }
} }
private long transferToDirectly(long position, int icount,
WritableByteChannel target)
throws IOException
{
if (!transferSupported)
return IOStatus.UNSUPPORTED;
FileDescriptor targetFD = null;
if (target instanceof FileChannelImpl) {
if (!fileSupported)
return IOStatus.UNSUPPORTED_CASE;
targetFD = ((FileChannelImpl)target).fd;
} else if (target instanceof SelChImpl) {
// Direct transfer to pipe causes EINVAL on some configurations
if ((target instanceof SinkChannelImpl) && !pipeSupported)
return IOStatus.UNSUPPORTED_CASE;
// Platform-specific restrictions. Now there is only one:
// Direct transfer to non-blocking channel could be forbidden
SelectableChannel sc = (SelectableChannel)target;
if (!nd.canTransferToDirectly(sc))
return IOStatus.UNSUPPORTED_CASE;
targetFD = ((SelChImpl)target).getFD();
}
if (targetFD == null)
return IOStatus.UNSUPPORTED;
int thisFDVal = IOUtil.fdVal(fd);
int targetFDVal = IOUtil.fdVal(targetFD);
if (thisFDVal == targetFDVal) // Not supported on some configurations
return IOStatus.UNSUPPORTED;
if (nd.transferToDirectlyNeedsPositionLock()) {
synchronized (positionLock) {
long pos = position();
try {
return transferToDirectlyInternal(position, icount,
target, targetFD);
} finally {
position(pos);
}
}
} else {
return transferToDirectlyInternal(position, icount, target, targetFD);
}
}
// Maximum size to map when using a mapped buffer // Maximum size to map when using a mapped buffer
private static final long MAPPED_TRANSFER_SIZE = 8L*1024L*1024L; private static final long MAPPED_TRANSFER_SIZE = 8L*1024L*1024L;
...@@ -1176,7 +1208,8 @@ public class FileChannelImpl ...@@ -1176,7 +1208,8 @@ public class FileChannelImpl
private static native int unmap0(long address, long length); private static native int unmap0(long address, long length);
// Transfers from src to dst, or returns -2 if kernel can't do that // Transfers from src to dst, or returns -2 if kernel can't do that
private native long transferTo0(int src, long position, long count, int dst); private native long transferTo0(FileDescriptor src, long position,
long count, FileDescriptor dst);
// Sets or reports this file's position // Sets or reports this file's position
// If offset is -1, the current position is returned // If offset is -1, the current position is returned
......
...@@ -25,7 +25,9 @@ ...@@ -25,7 +25,9 @@
package sun.nio.ch; package sun.nio.ch;
import java.io.*; import java.io.FileDescriptor;
import java.io.IOException;
import java.nio.channels.SelectableChannel;
abstract class FileDispatcher extends NativeDispatcher { abstract class FileDispatcher extends NativeDispatcher {
...@@ -53,4 +55,8 @@ abstract class FileDispatcher extends NativeDispatcher { ...@@ -53,4 +55,8 @@ abstract class FileDispatcher extends NativeDispatcher {
*/ */
abstract FileDescriptor duplicateForMapping(FileDescriptor fd) abstract FileDescriptor duplicateForMapping(FileDescriptor fd)
throws IOException; throws IOException;
abstract boolean canTransferToDirectly(SelectableChannel sc);
abstract boolean transferToDirectlyNeedsPositionLock();
} }
...@@ -50,30 +50,8 @@ public class Net { ...@@ -50,30 +50,8 @@ public class Net {
// set to true if exclusive binding is on for Windows // set to true if exclusive binding is on for Windows
private static final boolean exclusiveBind; private static final boolean exclusiveBind;
static { // set to true if the fast tcp loopback should be enabled on Windows
int availLevel = isExclusiveBindAvailable(); private static final boolean fastLoopback;
if (availLevel >= 0) {
String exclBindProp =
java.security.AccessController.doPrivileged(
new PrivilegedAction<String>() {
@Override
public String run() {
return System.getProperty(
"sun.net.useExclusiveBind");
}
});
if (exclBindProp != null) {
exclusiveBind = exclBindProp.length() == 0 ?
true : Boolean.parseBoolean(exclBindProp);
} else if (availLevel == 1) {
exclusiveBind = true;
} else {
exclusiveBind = false;
}
} else {
exclusiveBind = false;
}
}
// -- Miscellaneous utilities -- // -- Miscellaneous utilities --
...@@ -391,6 +369,23 @@ public class Net { ...@@ -391,6 +369,23 @@ public class Net {
} }
} }
public static boolean isFastTcpLoopbackRequested() {
String loopbackProp = java.security.AccessController.doPrivileged(
new PrivilegedAction<String>() {
@Override
public String run() {
return System.getProperty("jdk.net.useFastTcpLoopback");
}
});
boolean enable;
if ("".equals(loopbackProp)) {
enable = true;
} else {
enable = Boolean.parseBoolean(loopbackProp);
}
return enable;
}
// -- Socket operations -- // -- Socket operations --
private static native boolean isIPv6Available0(); private static native boolean isIPv6Available0();
...@@ -413,15 +408,16 @@ public class Net { ...@@ -413,15 +408,16 @@ public class Net {
throws IOException { throws IOException {
boolean preferIPv6 = isIPv6Available() && boolean preferIPv6 = isIPv6Available() &&
(family != StandardProtocolFamily.INET); (family != StandardProtocolFamily.INET);
return IOUtil.newFD(socket0(preferIPv6, stream, false)); return IOUtil.newFD(socket0(preferIPv6, stream, false, fastLoopback));
} }
static FileDescriptor serverSocket(boolean stream) { static FileDescriptor serverSocket(boolean stream) {
return IOUtil.newFD(socket0(isIPv6Available(), stream, true)); return IOUtil.newFD(socket0(isIPv6Available(), stream, true, fastLoopback));
} }
// Due to oddities SO_REUSEADDR on windows reuse is ignored // Due to oddities SO_REUSEADDR on windows reuse is ignored
private static native int socket0(boolean preferIPv6, boolean stream, boolean reuse); private static native int socket0(boolean preferIPv6, boolean stream, boolean reuse,
boolean fastLoopback);
public static void bind(FileDescriptor fd, InetAddress addr, int port) public static void bind(FileDescriptor fd, InetAddress addr, int port)
throws IOException throws IOException
...@@ -634,4 +630,30 @@ public class Net { ...@@ -634,4 +630,30 @@ public class Net {
POLLCONN = pollconnValue(); POLLCONN = pollconnValue();
} }
static {
int availLevel = isExclusiveBindAvailable();
if (availLevel >= 0) {
String exclBindProp =
java.security.AccessController.doPrivileged(
new PrivilegedAction<String>() {
@Override
public String run() {
return System.getProperty(
"sun.net.useExclusiveBind");
}
});
if (exclBindProp != null) {
exclusiveBind = exclBindProp.length() == 0 ?
true : Boolean.parseBoolean(exclBindProp);
} else if (availLevel == 1) {
exclusiveBind = true;
} else {
exclusiveBind = false;
}
} else {
exclusiveBind = false;
}
fastLoopback = isFastTcpLoopbackRequested();
}
} }
...@@ -182,9 +182,13 @@ NET_MapSocketOption(jint cmd, int *level, int *optname); ...@@ -182,9 +182,13 @@ NET_MapSocketOption(jint cmd, int *level, int *optname);
JNIEXPORT int JNICALL JNIEXPORT int JNICALL
NET_MapSocketOptionV6(jint cmd, int *level, int *optname); NET_MapSocketOptionV6(jint cmd, int *level, int *optname);
JNIEXPORT jint JNICALL
NET_EnableFastTcpLoopback(int fd);
int getScopeID (struct sockaddr *); int getScopeID (struct sockaddr *);
int cmpScopeID (unsigned int, struct sockaddr *); int cmpScopeID (unsigned int, struct sockaddr *);
unsigned short in_cksum(unsigned short *addr, int len); unsigned short in_cksum(unsigned short *addr, int len);
#endif /* NET_UTILS_H */ #endif /* NET_UTILS_H */
...@@ -25,10 +25,10 @@ ...@@ -25,10 +25,10 @@
package sun.nio.ch; package sun.nio.ch;
import java.io.*; import java.io.FileDescriptor;
import java.io.IOException;
class FileDispatcherImpl extends FileDispatcher class FileDispatcherImpl extends FileDispatcher {
{
static { static {
IOUtil.load(); IOUtil.load();
...@@ -108,6 +108,14 @@ class FileDispatcherImpl extends FileDispatcher ...@@ -108,6 +108,14 @@ class FileDispatcherImpl extends FileDispatcher
return new FileDescriptor(); return new FileDescriptor();
} }
boolean canTransferToDirectly(java.nio.channels.SelectableChannel sc) {
return true;
}
boolean transferToDirectlyNeedsPositionLock() {
return false;
}
// -- Native methods -- // -- Native methods --
static native int read0(FileDescriptor fd, long address, int len) static native int read0(FileDescriptor fd, long address, int len)
......
...@@ -777,6 +777,11 @@ void parseExclusiveBindProperty(JNIEnv *env) { ...@@ -777,6 +777,11 @@ void parseExclusiveBindProperty(JNIEnv *env) {
#endif #endif
} }
JNIEXPORT jint JNICALL
NET_EnableFastTcpLoopback(int fd) {
return 0;
}
/* In the case of an IPv4 Inetaddress this method will return an /* In the case of an IPv4 Inetaddress this method will return an
* IPv4 mapped address where IPv6 is available and v4MappedAddress is TRUE. * IPv4 mapped address where IPv6 is available and v4MappedAddress is TRUE.
* Otherwise it will return a sockaddr_in structure for an IPv4 InetAddress. * Otherwise it will return a sockaddr_in structure for an IPv4 InetAddress.
......
...@@ -154,10 +154,13 @@ Java_sun_nio_ch_FileChannelImpl_close0(JNIEnv *env, jobject this, jobject fdo) ...@@ -154,10 +154,13 @@ Java_sun_nio_ch_FileChannelImpl_close0(JNIEnv *env, jobject this, jobject fdo)
JNIEXPORT jlong JNICALL JNIEXPORT jlong JNICALL
Java_sun_nio_ch_FileChannelImpl_transferTo0(JNIEnv *env, jobject this, Java_sun_nio_ch_FileChannelImpl_transferTo0(JNIEnv *env, jobject this,
jint srcFD, jobject srcFDO,
jlong position, jlong count, jlong position, jlong count,
jint dstFD) jobject dstFDO)
{ {
jint srcFD = fdval(env, srcFDO);
jint dstFD = fdval(env, dstFDO);
#if defined(__linux__) #if defined(__linux__)
off64_t offset = (off64_t)position; off64_t offset = (off64_t)position;
jlong n = sendfile64(dstFD, srcFD, &offset, (size_t)count); jlong n = sendfile64(dstFD, srcFD, &offset, (size_t)count);
......
...@@ -231,7 +231,7 @@ Java_sun_nio_ch_Net_canJoin6WithIPv4Group0(JNIEnv* env, jclass cl) ...@@ -231,7 +231,7 @@ Java_sun_nio_ch_Net_canJoin6WithIPv4Group0(JNIEnv* env, jclass cl)
JNIEXPORT int JNICALL JNIEXPORT int JNICALL
Java_sun_nio_ch_Net_socket0(JNIEnv *env, jclass cl, jboolean preferIPv6, Java_sun_nio_ch_Net_socket0(JNIEnv *env, jclass cl, jboolean preferIPv6,
jboolean stream, jboolean reuse) jboolean stream, jboolean reuse, jboolean ignored)
{ {
int fd; int fd;
int type = (stream ? SOCK_STREAM : SOCK_DGRAM); int type = (stream ? SOCK_STREAM : SOCK_DGRAM);
......
...@@ -25,15 +25,16 @@ ...@@ -25,15 +25,16 @@
package sun.nio.ch; package sun.nio.ch;
import java.io.*; import java.io.FileDescriptor;
import java.io.IOException;
import java.security.PrivilegedAction;
import sun.misc.SharedSecrets; import sun.misc.SharedSecrets;
import sun.misc.JavaIOFileDescriptorAccess; import sun.misc.JavaIOFileDescriptorAccess;
class FileDispatcherImpl extends FileDispatcher class FileDispatcherImpl extends FileDispatcher {
{
static { // set to true if fast file transmission (TransmitFile) is enabled
IOUtil.load(); private static final boolean fastFileTransfer;
}
/** /**
* Indicates if the dispatcher should first advance the file position * Indicates if the dispatcher should first advance the file position
...@@ -120,6 +121,36 @@ class FileDispatcherImpl extends FileDispatcher ...@@ -120,6 +121,36 @@ class FileDispatcherImpl extends FileDispatcher
return result; return result;
} }
boolean canTransferToDirectly(java.nio.channels.SelectableChannel sc) {
return fastFileTransfer && sc.isBlocking();
}
boolean transferToDirectlyNeedsPositionLock() {
return true;
}
static boolean isFastFileTransferRequested() {
String fileTransferProp = java.security.AccessController.doPrivileged(
new PrivilegedAction<String>() {
@Override
public String run() {
return System.getProperty("jdk.net.enableFastFileTransfer");
}
});
boolean enable;
if ("".equals(fileTransferProp)) {
enable = true;
} else {
enable = Boolean.parseBoolean(fileTransferProp);
}
return enable;
}
static {
IOUtil.load();
fastFileTransfer = isFastFileTransferRequested();
}
//-- Native methods //-- Native methods
static native int read0(FileDescriptor fd, long address, int len) static native int read0(FileDescriptor fd, long address, int len)
......
...@@ -29,6 +29,9 @@ ...@@ -29,6 +29,9 @@
#include "net_util.h" #include "net_util.h"
#include "jni.h" #include "jni.h"
// Taken from mstcpip.h in Windows SDK 8.0 or newer.
#define SIO_LOOPBACK_FAST_PATH _WSAIOW(IOC_VENDOR,16)
#ifndef IPTOS_TOS_MASK #ifndef IPTOS_TOS_MASK
#define IPTOS_TOS_MASK 0x1e #define IPTOS_TOS_MASK 0x1e
#endif #endif
...@@ -844,6 +847,25 @@ jint getDefaultIPv6Interface(JNIEnv *env, struct SOCKADDR_IN6 *target_addr) ...@@ -844,6 +847,25 @@ jint getDefaultIPv6Interface(JNIEnv *env, struct SOCKADDR_IN6 *target_addr)
} }
} }
/**
* Enables SIO_LOOPBACK_FAST_PATH
*/
JNIEXPORT jint JNICALL
NET_EnableFastTcpLoopback(int fd) {
int enabled = 1;
DWORD result_byte_count = -1;
int result = WSAIoctl(fd,
SIO_LOOPBACK_FAST_PATH,
&enabled,
sizeof(enabled),
NULL,
0,
&result_byte_count,
NULL,
NULL);
return result == SOCKET_ERROR ? WSAGetLastError() : 0;
}
/* If address types is IPv6, then IPv6 must be available. Otherwise /* If address types is IPv6, then IPv6 must be available. Otherwise
* no address can be generated. In the case of an IPv4 Inetaddress this * no address can be generated. In the case of an IPv4 Inetaddress this
* method will return an IPv4 mapped address where IPv6 is available and * method will return an IPv4 mapped address where IPv6 is available and
......
...@@ -31,6 +31,10 @@ ...@@ -31,6 +31,10 @@
#include "nio.h" #include "nio.h"
#include "nio_util.h" #include "nio_util.h"
#include "sun_nio_ch_FileChannelImpl.h" #include "sun_nio_ch_FileChannelImpl.h"
#include "java_lang_Integer.h"
#include <Mswsock.h>
#pragma comment(lib, "Mswsock.lib")
static jfieldID chan_fd; /* id for jobject 'fd' in java.io.FileChannel */ static jfieldID chan_fd; /* id for jobject 'fd' in java.io.FileChannel */
...@@ -174,9 +178,42 @@ Java_sun_nio_ch_FileChannelImpl_close0(JNIEnv *env, jobject this, jobject fdo) ...@@ -174,9 +178,42 @@ Java_sun_nio_ch_FileChannelImpl_close0(JNIEnv *env, jobject this, jobject fdo)
JNIEXPORT jlong JNICALL JNIEXPORT jlong JNICALL
Java_sun_nio_ch_FileChannelImpl_transferTo0(JNIEnv *env, jobject this, Java_sun_nio_ch_FileChannelImpl_transferTo0(JNIEnv *env, jobject this,
jint srcFD, jobject srcFD,
jlong position, jlong count, jlong position, jlong count,
jint dstFD) jobject dstFD)
{ {
return IOS_UNSUPPORTED; const int PACKET_SIZE = 524288;
HANDLE src = (HANDLE)(handleval(env, srcFD));
SOCKET dst = (SOCKET)(fdval(env, dstFD));
DWORD chunkSize = (count > java_lang_Integer_MAX_VALUE) ?
java_lang_Integer_MAX_VALUE : (DWORD)count;
BOOL result = 0;
jlong pos = Java_sun_nio_ch_FileChannelImpl_position0(env, this, srcFD, position);
if (pos == IOS_THROWN) {
return IOS_THROWN;
}
result = TransmitFile(
dst,
src,
chunkSize,
PACKET_SIZE,
NULL,
NULL,
TF_USE_KERNEL_APC
);
if (!result) {
int error = WSAGetLastError();
if (WSAEINVAL == error && count >= 0) {
return IOS_UNSUPPORTED_CASE;
}
if (WSAENOTSOCK == error) {
return IOS_UNSUPPORTED_CASE;
}
JNU_ThrowIOExceptionWithLastError(env, "transfer failed");
return IOS_THROWN;
}
return chunkSize;
} }
...@@ -127,7 +127,7 @@ Java_sun_nio_ch_Net_canJoin6WithIPv4Group0(JNIEnv* env, jclass cl) ...@@ -127,7 +127,7 @@ Java_sun_nio_ch_Net_canJoin6WithIPv4Group0(JNIEnv* env, jclass cl)
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_sun_nio_ch_Net_socket0(JNIEnv *env, jclass cl, jboolean preferIPv6, Java_sun_nio_ch_Net_socket0(JNIEnv *env, jclass cl, jboolean preferIPv6,
jboolean stream, jboolean reuse) jboolean stream, jboolean reuse, jboolean fastLoopback)
{ {
SOCKET s; SOCKET s;
int domain = (preferIPv6) ? AF_INET6 : AF_INET; int domain = (preferIPv6) ? AF_INET6 : AF_INET;
...@@ -152,6 +152,20 @@ Java_sun_nio_ch_Net_socket0(JNIEnv *env, jclass cl, jboolean preferIPv6, ...@@ -152,6 +152,20 @@ Java_sun_nio_ch_Net_socket0(JNIEnv *env, jclass cl, jboolean preferIPv6,
NET_ThrowNew(env, WSAGetLastError(), "socket"); NET_ThrowNew(env, WSAGetLastError(), "socket");
} }
if (stream && fastLoopback) {
static int loopback_available = 1;
if (loopback_available) {
int rv = NET_EnableFastTcpLoopback((jint)s);
if (rv) {
if (rv == WSAEOPNOTSUPP) {
loopback_available = 0;
} else {
NET_ThrowNew(env, rv, "fastLoopback");
}
}
}
}
return (jint)s; return (jint)s;
} }
......
...@@ -75,13 +75,13 @@ ${TESTJAVA}${FS}bin${FS}java -version ...@@ -75,13 +75,13 @@ ${TESTJAVA}${FS}bin${FS}java -version
mkdir bug mkdir bug
cp ${TESTSRC}${FS}bug.idl . cp ${TESTSRC}${FS}bug.idl .
${TESTJAVA}${FS}bin${FS}idlj bug.idl ${COMPILEJAVA}${FS}bin${FS}idlj bug.idl
cp ${TESTSRC}${FS}JavaBug.java bug cp ${TESTSRC}${FS}JavaBug.java bug
chmod -fR 777 bug chmod -fR 777 bug
${TESTJAVA}${FS}bin${FS}javac -d . bug${FS}*.java ${COMPILEJAVA}${FS}bin${FS}javac -d . bug${FS}*.java
${TESTJAVA}${FS}bin${FS}java -cp . bug/JavaBug > test.out 2>&1 ${TESTJAVA}${FS}bin${FS}java -cp . bug/JavaBug > test.out 2>&1
......
...@@ -55,8 +55,8 @@ PORT=1052 ...@@ -55,8 +55,8 @@ PORT=1052
cp -r ${TESTSRC}${FS}*.java ${TESTSRC}${FS}Hello.idl . cp -r ${TESTSRC}${FS}*.java ${TESTSRC}${FS}Hello.idl .
echo "Testing...please wait" echo "Testing...please wait"
${TESTJAVA}${FS}bin${FS}idlj -fall Hello.idl ${COMPILEJAVA}${FS}bin${FS}idlj -fall Hello.idl
${TESTJAVA}${FS}bin${FS}javac *.java HelloApp/*.java ${COMPILEJAVA}${FS}bin${FS}javac *.java HelloApp/*.java
echo "starting orbd" echo "starting orbd"
${TESTJAVA}${FS}bin${FS}orbd -ORBInitialPort $PORT -ORBInitialHost localhost & ${TESTJAVA}${FS}bin${FS}orbd -ORBInitialPort $PORT -ORBInitialHost localhost &
......
...@@ -24,6 +24,8 @@ ...@@ -24,6 +24,8 @@
/* @test /* @test
* @bug 6834246 6842687 * @bug 6834246 6842687
* @summary Stress test connections through the loopback interface * @summary Stress test connections through the loopback interface
* @run main StressLoopback
* @run main/othervm -Djdk.net.useFastTcpLoopback StressLoopback
*/ */
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
......
...@@ -24,6 +24,8 @@ ...@@ -24,6 +24,8 @@
/* @test /* @test
* @bug 4652496 * @bug 4652496
* @summary Test transferTo with different target channels * @summary Test transferTo with different target channels
* @run main TransferToChannel
* @run main/othervm -Djdk.net.enableFastFileTransfer TransferToChannel
*/ */
import java.nio.channels.FileChannel; import java.nio.channels.FileChannel;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册