Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_jdk
提交
05fcc8ff
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看板
提交
05fcc8ff
编写于
3月 12, 2014
作者:
I
igerasim
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
8034262: Test java/lang/ProcessBuilder/CloseRace.java fails
Reviewed-by: martin, dholmes
上级
7231e628
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
41 addition
and
5 deletion
+41
-5
test/java/lang/ProcessBuilder/CloseRace.java
test/java/lang/ProcessBuilder/CloseRace.java
+41
-5
未找到文件。
test/java/lang/ProcessBuilder/CloseRace.java
浏览文件 @
05fcc8ff
...
...
@@ -33,6 +33,8 @@
import
java.io.*
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.concurrent.CountDownLatch
;
public
class
CloseRace
{
private
static
final
String
BIG_FILE
=
"bigfile"
;
...
...
@@ -43,6 +45,9 @@ public class CloseRace {
private
static
final
int
testDurationSeconds
=
Integer
.
getInteger
(
"test.duration"
,
600
);
private
static
final
CountDownLatch
threadsStarted
=
new
CountDownLatch
(
2
);
static
boolean
fdInUse
(
int
i
)
{
return
new
File
(
"/proc/self/fd/"
+
i
).
exists
();
}
...
...
@@ -61,6 +66,18 @@ public class CloseRace {
return
count
;
}
static
void
dumpAllStacks
()
{
System
.
err
.
println
(
"Start of dump"
);
final
Map
<
Thread
,
StackTraceElement
[]>
allStackTraces
=
Thread
.
getAllStackTraces
();
for
(
Thread
thread
:
allStackTraces
.
keySet
())
{
System
.
err
.
println
(
"Thread "
+
thread
.
getName
());
for
(
StackTraceElement
element
:
allStackTraces
.
get
(
thread
))
System
.
err
.
println
(
"\t"
+
element
);
}
System
.
err
.
println
(
"End of dump"
);
}
public
static
void
main
(
String
args
[])
throws
Exception
{
if
(!(
new
File
(
"/proc/self/fd"
).
isDirectory
()))
return
;
...
...
@@ -84,26 +101,41 @@ public class CloseRace {
for
(
Thread
thread
:
threads
)
thread
.
start
();
threadsStarted
.
await
();
Thread
.
sleep
(
testDurationSeconds
*
1000
);
for
(
Thread
thread
:
threads
)
thread
.
interrupt
();
for
(
Thread
thread
:
threads
)
thread
.
join
();
for
(
Thread
thread
:
threads
)
{
thread
.
join
(
10_000
);
if
(
thread
.
isAlive
())
{
dumpAllStacks
();
throw
new
Error
(
"At least one child thread ("
+
thread
.
getName
()
+
") failed to finish gracefully"
);
}
}
}
static
class
OpenLoop
implements
Runnable
{
public
void
run
()
{
threadsStarted
.
countDown
();
while
(!
Thread
.
interrupted
())
{
try
{
// wait for ExecLoop to finish creating process
do
{}
while
(
count
(
procFDsInUse
())
!=
3
);
do
{
if
(
Thread
.
interrupted
())
return
;
}
while
(
count
(
procFDsInUse
())
!=
3
);
List
<
InputStream
>
iss
=
new
ArrayList
<>(
4
);
// eat up three "holes" (closed ends of pipe fd pairs)
for
(
int
i
=
0
;
i
<
3
;
i
++)
iss
.
add
(
new
FileInputStream
(
BIG_FILE
));
do
{}
while
(
count
(
procFDsInUse
())
==
procFDs
.
length
);
do
{
if
(
Thread
.
interrupted
())
return
;
}
while
(
count
(
procFDsInUse
())
==
procFDs
.
length
);
// hopefully this will racily occupy empty fd slot
iss
.
add
(
new
FileInputStream
(
BIG_FILE
));
Thread
.
sleep
(
1
);
// Widen race window
...
...
@@ -120,11 +152,15 @@ public class CloseRace {
static
class
ExecLoop
implements
Runnable
{
public
void
run
()
{
threadsStarted
.
countDown
();
ProcessBuilder
builder
=
new
ProcessBuilder
(
"/bin/true"
);
while
(!
Thread
.
interrupted
())
{
try
{
// wait for OpenLoop to finish
do
{}
while
(
count
(
procFDsInUse
())
>
0
);
do
{
if
(
Thread
.
interrupted
())
return
;
}
while
(
count
(
procFDsInUse
())
>
0
);
Process
process
=
builder
.
start
();
InputStream
is
=
process
.
getInputStream
();
process
.
waitFor
();
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录