Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_jdk
提交
da4388c7
D
dragonwell8_jdk
项目概览
openanolis
/
dragonwell8_jdk
通知
4
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
dragonwell8_jdk
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
da4388c7
编写于
9月 11, 2015
作者:
I
igerasim
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
8072466: Deadlock when initializing MulticastSocket and DatagramSocket
Reviewed-by: chegar
上级
ef3b007e
变更
12
隐藏空白更改
内联
并排
Showing
12 changed file
with
274 addition
and
228 deletion
+274
-228
make/mapfiles/libnet/mapfile-vers
make/mapfiles/libnet/mapfile-vers
+2
-3
src/share/classes/java/net/AbstractPlainDatagramSocketImpl.java
...are/classes/java/net/AbstractPlainDatagramSocketImpl.java
+2
-4
src/solaris/classes/java/net/PlainDatagramSocketImpl.java
src/solaris/classes/java/net/PlainDatagramSocketImpl.java
+3
-1
src/solaris/native/java/net/AbstractPlainDatagramSocketImpl.c
...solaris/native/java/net/AbstractPlainDatagramSocketImpl.c
+0
-89
src/solaris/native/java/net/PlainDatagramSocketImpl.c
src/solaris/native/java/net/PlainDatagramSocketImpl.c
+34
-1
src/windows/classes/java/net/DefaultDatagramSocketImplFactory.java
...ws/classes/java/net/DefaultDatagramSocketImplFactory.java
+18
-13
src/windows/classes/java/net/DualStackPlainDatagramSocketImpl.java
...ws/classes/java/net/DualStackPlainDatagramSocketImpl.java
+7
-1
src/windows/classes/java/net/TwoStacksPlainDatagramSocketImpl.java
...ws/classes/java/net/TwoStacksPlainDatagramSocketImpl.java
+3
-1
src/windows/native/java/net/AbstractPlainDatagramSocketImpl.c
...windows/native/java/net/AbstractPlainDatagramSocketImpl.c
+0
-113
src/windows/native/java/net/DualStackPlainDatagramSocketImpl.c
...indows/native/java/net/DualStackPlainDatagramSocketImpl.c
+49
-1
src/windows/native/java/net/TwoStacksPlainDatagramSocketImpl.c
...indows/native/java/net/TwoStacksPlainDatagramSocketImpl.c
+42
-1
test/java/net/MulticastSocket/MultiDead.java
test/java/net/MulticastSocket/MultiDead.java
+114
-0
未找到文件。
make/mapfiles/libnet/mapfile-vers
浏览文件 @
da4388c7
#
# Copyright (c) 1997, 201
3
, Oracle and/or its affiliates. All rights reserved.
# Copyright (c) 1997, 201
5
, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
...
...
@@ -28,8 +28,7 @@
SUNWprivate_1.1 {
global:
JNI_OnLoad;
Java_java_net_AbstractPlainDatagramSocketImpl_init;
Java_java_net_AbstractPlainDatagramSocketImpl_dataAvailable;
Java_java_net_PlainDatagramSocketImpl_dataAvailable;
Java_java_net_PlainSocketImpl_socketListen;
Java_java_net_PlainDatagramSocketImpl_getTTL;
Java_java_net_PlainDatagramSocketImpl_init;
...
...
src/share/classes/java/net/AbstractPlainDatagramSocketImpl.java
浏览文件 @
da4388c7
/*
* Copyright (c) 1996, 201
3
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1996, 201
5
, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
...
...
@@ -68,7 +68,6 @@ abstract class AbstractPlainDatagramSocketImpl extends DatagramSocketImpl
return
null
;
}
});
init
();
}
/**
...
...
@@ -364,6 +363,5 @@ abstract class AbstractPlainDatagramSocketImpl extends DatagramSocketImpl
return
connectDisabled
;
}
native
int
dataAvailable
();
private
static
native
void
init
();
abstract
int
dataAvailable
();
}
src/solaris/classes/java/net/PlainDatagramSocketImpl.java
浏览文件 @
da4388c7
/*
* Copyright (c) 2007,
2011
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2007,
2015
, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
...
...
@@ -119,6 +119,8 @@ class PlainDatagramSocketImpl extends AbstractPlainDatagramSocketImpl
protected
native
void
disconnect0
(
int
family
);
native
int
dataAvailable
();
/**
* Perform class load-time initializations.
*/
...
...
src/solaris/native/java/net/AbstractPlainDatagramSocketImpl.c
已删除
100644 → 0
浏览文件 @
ef3b007e
/*
* Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
#include <sys/types.h>
#include <sys/socket.h>
#ifdef __solaris__
#include <unistd.h>
#include <stropts.h>
#ifndef BSD_COMP
#define BSD_COMP
#endif
#endif
#include <sys/ioctl.h>
#include "jvm.h"
#include "jni_util.h"
#include "net_util.h"
#include "java_net_AbstractPlainDatagramSocketImpl.h"
static
jfieldID
IO_fd_fdID
;
static
jfieldID
apdsi_fdID
;
/*
* Class: java_net_AbstractPlainDatagramSocketImpl
* Method: init
* Signature: ()V
*/
JNIEXPORT
void
JNICALL
Java_java_net_AbstractPlainDatagramSocketImpl_init
(
JNIEnv
*
env
,
jclass
cls
)
{
apdsi_fdID
=
(
*
env
)
->
GetFieldID
(
env
,
cls
,
"fd"
,
"Ljava/io/FileDescriptor;"
);
CHECK_NULL
(
apdsi_fdID
);
IO_fd_fdID
=
NET_GetFileDescriptorID
(
env
);
}
/*
* Class: java_net_AbstractPlainDatagramSocketImpl
* Method: dataAvailable
* Signature: ()I
*/
JNIEXPORT
jint
JNICALL
Java_java_net_AbstractPlainDatagramSocketImpl_dataAvailable
(
JNIEnv
*
env
,
jobject
this
)
{
int
fd
,
retval
;
jobject
fdObj
=
(
*
env
)
->
GetObjectField
(
env
,
this
,
apdsi_fdID
);
if
(
IS_NULL
(
fdObj
))
{
JNU_ThrowByName
(
env
,
JNU_JAVANETPKG
"SocketException"
,
"Socket closed"
);
return
-
1
;
}
fd
=
(
*
env
)
->
GetIntField
(
env
,
fdObj
,
IO_fd_fdID
);
if
(
ioctl
(
fd
,
FIONREAD
,
&
retval
)
<
0
)
{
return
-
1
;
}
return
retval
;
}
src/solaris/native/java/net/PlainDatagramSocketImpl.c
浏览文件 @
da4388c7
/*
* Copyright (c) 1997, 201
4
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 201
5
, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
...
...
@@ -32,6 +32,12 @@
#ifdef __solaris__
#include <fcntl.h>
#include <unistd.h>
#include <stropts.h>
#ifndef BSD_COMP
#define BSD_COMP
#endif
#endif
#ifdef __linux__
#include <unistd.h>
...
...
@@ -52,6 +58,8 @@
#endif
#endif // __linux__
#include <sys/ioctl.h>
#ifndef IPTOS_TOS_MASK
#define IPTOS_TOS_MASK 0x1e
#endif
...
...
@@ -2265,3 +2273,28 @@ Java_java_net_PlainDatagramSocketImpl_leave(JNIEnv *env, jobject this,
{
mcast_join_leave
(
env
,
this
,
iaObj
,
niObj
,
JNI_FALSE
);
}
/*
* Class: java_net_PlainDatagramSocketImpl
* Method: dataAvailable
* Signature: ()I
*/
JNIEXPORT
jint
JNICALL
Java_java_net_PlainDatagramSocketImpl_dataAvailable
(
JNIEnv
*
env
,
jobject
this
)
{
int
fd
,
retval
;
jobject
fdObj
=
(
*
env
)
->
GetObjectField
(
env
,
this
,
pdsi_fdID
);
if
(
IS_NULL
(
fdObj
))
{
JNU_ThrowByName
(
env
,
JNU_JAVANETPKG
"SocketException"
,
"Socket closed"
);
return
-
1
;
}
fd
=
(
*
env
)
->
GetIntField
(
env
,
fdObj
,
IO_fd_fdID
);
if
(
ioctl
(
fd
,
FIONREAD
,
&
retval
)
<
0
)
{
return
-
1
;
}
return
retval
;
}
src/windows/classes/java/net/DefaultDatagramSocketImplFactory.java
浏览文件 @
da4388c7
/*
* Copyright (c) 2007, 201
3
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2007, 201
5
, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
...
...
@@ -45,7 +45,7 @@ import java.security.PrivilegedAction;
class
DefaultDatagramSocketImplFactory
{
static
Class
<?>
prefixImplClass
=
null
;
private
final
static
Class
<?>
prefixImplClass
;
/* the windows version. */
private
static
float
version
;
...
...
@@ -54,16 +54,19 @@ class DefaultDatagramSocketImplFactory
private
static
boolean
preferIPv4Stack
=
false
;
/* If the version supports a dual stack TCP implementation */
private
static
boolean
useDualStackImpl
=
false
;
private
final
static
boolean
useDualStackImpl
;
/* sun.net.useExclusiveBind */
private
static
String
exclBindProp
;
/* True if exclusive binding is on for Windows */
private
static
boolean
exclusiveBind
=
true
;
private
final
static
boolean
exclusiveBind
;
static
{
Class
<?>
prefixImplClassLocal
=
null
;
boolean
useDualStackImplLocal
=
false
;
boolean
exclusiveBindLocal
=
true
;
// Determine Windows Version.
java
.
security
.
AccessController
.
doPrivileged
(
new
PrivilegedAction
<
Object
>()
{
...
...
@@ -78,7 +81,7 @@ class DefaultDatagramSocketImplFactory
"java.net.preferIPv4Stack"
));
exclBindProp
=
System
.
getProperty
(
"sun.net.useExclusiveBind"
);
}
catch
(
NumberFormatException
e
)
{
}
catch
(
NumberFormatException
e
)
{
assert
false
:
e
;
}
return
null
;
// nothing to return
...
...
@@ -87,14 +90,14 @@ class DefaultDatagramSocketImplFactory
// (version >= 6.0) implies Vista or greater.
if
(
version
>=
6.0
&&
!
preferIPv4Stack
)
{
useDualStackImp
l
=
true
;
useDualStackImplLoca
l
=
true
;
}
if
(
exclBindProp
!=
null
)
{
// sun.net.useExclusiveBind is true
exclusiveBind
=
exclBindProp
.
length
()
==
0
?
true
exclusiveBind
Local
=
exclBindProp
.
length
()
==
0
?
true
:
Boolean
.
parseBoolean
(
exclBindProp
);
}
else
if
(
version
<
6.0
)
{
exclusiveBind
=
false
;
exclusiveBind
Local
=
false
;
}
// impl.prefix
...
...
@@ -103,12 +106,16 @@ class DefaultDatagramSocketImplFactory
prefix
=
AccessController
.
doPrivileged
(
new
sun
.
security
.
action
.
GetPropertyAction
(
"impl.prefix"
,
null
));
if
(
prefix
!=
null
)
prefixImplClass
=
Class
.
forName
(
"java.net."
+
prefix
+
"DatagramSocketImpl"
);
prefixImplClass
Local
=
Class
.
forName
(
"java.net."
+
prefix
+
"DatagramSocketImpl"
);
}
catch
(
Exception
e
)
{
System
.
err
.
println
(
"Can't find class: java.net."
+
prefix
+
"DatagramSocketImpl: check impl.prefix property"
);
}
prefixImplClass
=
prefixImplClassLocal
;
useDualStackImpl
=
useDualStackImplLocal
;
exclusiveBind
=
exclusiveBindLocal
;
}
/**
...
...
@@ -126,12 +133,10 @@ class DefaultDatagramSocketImplFactory
throw
new
SocketException
(
"can't instantiate DatagramSocketImpl"
);
}
}
else
{
if
(
isMulticast
)
exclusiveBind
=
false
;
if
(
useDualStackImpl
&&
!
isMulticast
)
return
new
DualStackPlainDatagramSocketImpl
(
exclusiveBind
);
else
return
new
TwoStacksPlainDatagramSocketImpl
(
exclusiveBind
);
return
new
TwoStacksPlainDatagramSocketImpl
(
exclusiveBind
&&
!
isMulticast
);
}
}
}
src/windows/classes/java/net/DualStackPlainDatagramSocketImpl.java
浏览文件 @
da4388c7
/*
* Copyright (c) 2007, 201
3
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2007, 201
5
, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
...
...
@@ -45,6 +45,10 @@ class DualStackPlainDatagramSocketImpl extends AbstractPlainDatagramSocketImpl
{
static
JavaIOFileDescriptorAccess
fdAccess
=
SharedSecrets
.
getJavaIOFileDescriptorAccess
();
static
{
initIDs
();
}
// true if this socket is exclusively bound
private
final
boolean
exclusiveBind
;
...
...
@@ -288,4 +292,6 @@ class DualStackPlainDatagramSocketImpl extends AbstractPlainDatagramSocketImpl
int
optionValue
)
throws
SocketException
;
private
static
native
int
socketGetIntOption
(
int
fd
,
int
cmd
)
throws
SocketException
;
native
int
dataAvailable
();
}
src/windows/classes/java/net/TwoStacksPlainDatagramSocketImpl.java
浏览文件 @
da4388c7
/*
* Copyright (c) 2007, 201
3
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2007, 201
5
, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
...
...
@@ -207,6 +207,8 @@ class TwoStacksPlainDatagramSocketImpl extends AbstractPlainDatagramSocketImpl
protected
native
void
disconnect0
(
int
family
);
native
int
dataAvailable
();
/**
* Perform class load-time initializations.
*/
...
...
src/windows/native/java/net/AbstractPlainDatagramSocketImpl.c
已删除
100644 → 0
浏览文件 @
ef3b007e
/*
* Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
#include <windows.h>
#include <winsock2.h>
#include "jvm.h"
#include "jni_util.h"
#include "net_util.h"
#include "java_net_AbstractPlainDatagramSocketImpl.h"
static
jfieldID
IO_fd_fdID
=
NULL
;
static
jfieldID
apdsi_fdID
=
NULL
;
static
jfieldID
apdsi_fd1ID
=
NULL
;
static
jclass
two_stacks_clazz
=
NULL
;
/*
* Class: java_net_AbstractPlainDatagramSocketImpl
* Method: init
* Signature: ()V
*/
JNIEXPORT
void
JNICALL
Java_java_net_AbstractPlainDatagramSocketImpl_init
(
JNIEnv
*
env
,
jclass
cls
)
{
apdsi_fdID
=
(
*
env
)
->
GetFieldID
(
env
,
cls
,
"fd"
,
"Ljava/io/FileDescriptor;"
);
CHECK_NULL
(
apdsi_fdID
);
IO_fd_fdID
=
NET_GetFileDescriptorID
(
env
);
CHECK_NULL
(
IO_fd_fdID
);
two_stacks_clazz
=
(
*
env
)
->
FindClass
(
env
,
"java/net/TwoStacksPlainDatagramSocketImpl"
);
CHECK_NULL
(
two_stacks_clazz
);
/* Handle both TwoStacks and DualStack here */
if
(
JNU_Equals
(
env
,
cls
,
two_stacks_clazz
))
{
/* fd1 present only in TwoStack.. */
apdsi_fd1ID
=
(
*
env
)
->
GetFieldID
(
env
,
cls
,
"fd1"
,
"Ljava/io/FileDescriptor;"
);
CHECK_NULL
(
apdsi_fd1ID
);
}
JNU_CHECK_EXCEPTION
(
env
);
}
/*
* Class: java_net_AbstractPlainDatagramSocketImpl
* Method: dataAvailable
* Signature: ()I
*/
JNIEXPORT
jint
JNICALL
Java_java_net_AbstractPlainDatagramSocketImpl_dataAvailable
(
JNIEnv
*
env
,
jobject
this
)
{
SOCKET
fd
;
SOCKET
fd1
;
int
rv
=
-
1
,
rv1
=
-
1
;
jobject
fdObj
=
(
*
env
)
->
GetObjectField
(
env
,
this
,
apdsi_fdID
);
if
(
!
IS_NULL
(
fdObj
))
{
int
retval
=
0
;
fd
=
(
SOCKET
)(
*
env
)
->
GetIntField
(
env
,
fdObj
,
IO_fd_fdID
);
rv
=
ioctlsocket
(
fd
,
FIONREAD
,
&
retval
);
if
(
retval
>
0
)
{
return
retval
;
}
}
if
(
!
IS_NULL
(
apdsi_fd1ID
))
{
/* TwoStacks */
jobject
fd1Obj
=
(
*
env
)
->
GetObjectField
(
env
,
this
,
apdsi_fd1ID
);
if
(
!
IS_NULL
(
fd1Obj
))
{
int
retval
=
0
;
fd1
=
(
SOCKET
)(
*
env
)
->
GetIntField
(
env
,
fd1Obj
,
IO_fd_fdID
);
rv1
=
ioctlsocket
(
fd1
,
FIONREAD
,
&
retval
);
if
(
retval
>
0
)
{
return
retval
;
}
}
}
if
(
rv
<
0
&&
rv1
<
0
)
{
JNU_ThrowByName
(
env
,
JNU_JAVANETPKG
"SocketException"
,
"Socket closed"
);
return
-
1
;
}
return
0
;
}
src/windows/native/java/net/DualStackPlainDatagramSocketImpl.c
浏览文件 @
da4388c7
/*
* Copyright (c) 2007, 201
3
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2007, 201
5
, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
...
...
@@ -70,6 +70,25 @@ static jboolean purgeOutstandingICMP(JNIEnv *env, jint fd)
return
got_icmp
;
}
static
jfieldID
IO_fd_fdID
=
NULL
;
static
jfieldID
pdsi_fdID
=
NULL
;
/*
* Class: java_net_DualStackPlainDatagramSocketImpl
* Method: initIDs
* Signature: ()V
*/
JNIEXPORT
void
JNICALL
Java_java_net_DualStackPlainDatagramSocketImpl_initIDs
(
JNIEnv
*
env
,
jclass
clazz
)
{
pdsi_fdID
=
(
*
env
)
->
GetFieldID
(
env
,
clazz
,
"fd"
,
"Ljava/io/FileDescriptor;"
);
CHECK_NULL
(
pdsi_fdID
);
IO_fd_fdID
=
NET_GetFileDescriptorID
(
env
);
CHECK_NULL
(
IO_fd_fdID
);
JNU_CHECK_EXCEPTION
(
env
);
}
/*
* Class: java_net_DualStackPlainDatagramSocketImpl
* Method: socketCreate
...
...
@@ -498,3 +517,32 @@ JNIEXPORT jint JNICALL Java_java_net_DualStackPlainDatagramSocketImpl_socketGetI
return
result
;
}
/*
* Class: java_net_DualStackPlainDatagramSocketImpl
* Method: dataAvailable
* Signature: ()I
*/
JNIEXPORT
jint
JNICALL
Java_java_net_DualStackPlainDatagramSocketImpl_dataAvailable
(
JNIEnv
*
env
,
jobject
this
)
{
SOCKET
fd
;
int
rv
=
-
1
;
jobject
fdObj
=
(
*
env
)
->
GetObjectField
(
env
,
this
,
pdsi_fdID
);
if
(
!
IS_NULL
(
fdObj
))
{
int
retval
=
0
;
fd
=
(
SOCKET
)(
*
env
)
->
GetIntField
(
env
,
fdObj
,
IO_fd_fdID
);
rv
=
ioctlsocket
(
fd
,
FIONREAD
,
&
retval
);
if
(
retval
>
0
)
{
return
retval
;
}
}
if
(
rv
<
0
)
{
JNU_ThrowByName
(
env
,
JNU_JAVANETPKG
"SocketException"
,
"Socket closed"
);
return
-
1
;
}
return
0
;
}
src/windows/native/java/net/TwoStacksPlainDatagramSocketImpl.c
浏览文件 @
da4388c7
/*
* Copyright (c) 1997, 201
3
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 201
5
, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
...
...
@@ -2591,3 +2591,44 @@ Java_java_net_TwoStacksPlainDatagramSocketImpl_leave(JNIEnv *env, jobject this,
{
mcast_join_leave
(
env
,
this
,
iaObj
,
niObj
,
JNI_FALSE
);
}
/*
* Class: java_net_TwoStacksPlainDatagramSocketImpl
* Method: dataAvailable
* Signature: ()I
*/
JNIEXPORT
jint
JNICALL
Java_java_net_TwoStacksPlainDatagramSocketImpl_dataAvailable
(
JNIEnv
*
env
,
jobject
this
)
{
SOCKET
fd
;
SOCKET
fd1
;
int
rv
=
-
1
,
rv1
=
-
1
;
jobject
fdObj
=
(
*
env
)
->
GetObjectField
(
env
,
this
,
pdsi_fdID
);
jobject
fd1Obj
;
if
(
!
IS_NULL
(
fdObj
))
{
int
retval
=
0
;
fd
=
(
SOCKET
)(
*
env
)
->
GetIntField
(
env
,
fdObj
,
IO_fd_fdID
);
rv
=
ioctlsocket
(
fd
,
FIONREAD
,
&
retval
);
if
(
retval
>
0
)
{
return
retval
;
}
}
fd1Obj
=
(
*
env
)
->
GetObjectField
(
env
,
this
,
pdsi_fd1ID
);
if
(
!
IS_NULL
(
fd1Obj
))
{
int
retval
=
0
;
fd1
=
(
SOCKET
)(
*
env
)
->
GetIntField
(
env
,
fd1Obj
,
IO_fd_fdID
);
rv1
=
ioctlsocket
(
fd1
,
FIONREAD
,
&
retval
);
if
(
retval
>
0
)
{
return
retval
;
}
}
if
(
rv
<
0
&&
rv1
<
0
)
{
JNU_ThrowByName
(
env
,
JNU_JAVANETPKG
"SocketException"
,
"Socket closed"
);
return
-
1
;
}
return
0
;
}
test/java/net/MulticastSocket/MultiDead.java
0 → 100644
浏览文件 @
da4388c7
/*
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/**
* @test
* @bug 8072466
* @summary Deadlock when initializing MulticastSocket and DatagramSocket
* @library /lib/testlibrary
* @build jdk.testlibrary.*
* @run main/othervm MultiDead
*/
import
java.net.DatagramSocket
;
import
java.net.MulticastSocket
;
import
java.util.concurrent.atomic.AtomicBoolean
;
import
java.util.concurrent.atomic.AtomicReference
;
import
java.util.concurrent.CountDownLatch
;
import
jdk.testlibrary.JDKToolLauncher
;
public
class
MultiDead
{
private
static
final
int
THREAD_PAIR_COUNT
=
4
;
private
static
final
int
CHILDREN_COUNT
=
20
;
public
static
void
main
(
String
[]
args
)
throws
Throwable
{
if
(
args
.
length
==
0
||
args
[
0
].
equals
(
"parent"
))
{
parentProcess
();
}
if
(
args
.
length
>
0
&&
args
[
0
].
equals
(
"child"
))
{
childProcess
();
}
}
private
static
void
parentProcess
()
throws
Throwable
{
JDKToolLauncher
launcher
=
JDKToolLauncher
.
createUsingTestJDK
(
"java"
)
.
addToolArg
(
"MultiDead"
)
.
addToolArg
(
"child"
);
ProcessBuilder
pb
=
new
ProcessBuilder
(
launcher
.
getCommand
());
AtomicReference
<
Process
>
child
=
new
AtomicReference
<>();
AtomicBoolean
stopFlag
=
new
AtomicBoolean
(
false
);
Thread
th
=
new
Thread
(()
->
{
for
(
int
i
=
0
;
i
<
CHILDREN_COUNT
;
++
i
)
{
System
.
out
.
println
(
"child #"
+
(
i
+
1
)
+
" of "
+
CHILDREN_COUNT
);
try
{
child
.
set
(
pb
.
start
());
child
.
get
().
waitFor
();
if
(
stopFlag
.
get
())
{
break
;
}
}
catch
(
Exception
e
)
{
throw
new
RuntimeException
(
e
);
}
}
});
th
.
start
();
th
.
join
(
CHILDREN_COUNT
*
1000
);
// 1 sec for a child to complete
stopFlag
.
set
(
true
);
if
(
th
.
isAlive
())
{
if
(
child
.
get
()
!=
null
)
{
child
.
get
().
destroyForcibly
();
}
throw
new
RuntimeException
(
"Failed to complete on time."
);
}
}
private
static
void
childProcess
()
{
CountDownLatch
latch
=
new
CountDownLatch
(
1
);
for
(
int
i
=
0
;
i
<
THREAD_PAIR_COUNT
;
++
i
)
{
new
Thread
(()
->
{
try
{
latch
.
await
();
try
(
MulticastSocket
a
=
new
MulticastSocket
(
6000
))
{
}
}
catch
(
Exception
ignore
)
{
}
}).
start
();
new
Thread
(()
->
{
try
{
latch
.
await
();
try
(
DatagramSocket
b
=
new
DatagramSocket
(
6000
))
{
}
}
catch
(
Exception
ignore
)
{
}
}).
start
();
}
latch
.
countDown
();
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录