Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_hotspot
提交
30f45144
D
dragonwell8_hotspot
项目概览
openanolis
/
dragonwell8_hotspot
通知
2
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
dragonwell8_hotspot
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
30f45144
编写于
11月 08, 2013
作者:
V
vlivanov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
8023037: Race between ciEnv::register_method and nmethod::make_not_entrant_or_zombie
Reviewed-by: kvn, iveresov
上级
cb9f828c
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
28 addition
and
52 deletion
+28
-52
src/cpu/sparc/vm/sharedRuntime_sparc.cpp
src/cpu/sparc/vm/sharedRuntime_sparc.cpp
+0
-12
src/share/vm/ci/ciEnv.cpp
src/share/vm/ci/ciEnv.cpp
+5
-14
src/share/vm/code/nmethod.cpp
src/share/vm/code/nmethod.cpp
+23
-23
src/share/vm/runtime/globals.hpp
src/share/vm/runtime/globals.hpp
+0
-3
未找到文件。
src/cpu/sparc/vm/sharedRuntime_sparc.cpp
浏览文件 @
30f45144
...
...
@@ -1002,18 +1002,6 @@ void AdapterGenerator::gen_i2c_adapter(
// and the vm will find there should this case occur.
Address
callee_target_addr
(
G2_thread
,
JavaThread
::
callee_target_offset
());
__
st_ptr
(
G5_method
,
callee_target_addr
);
if
(
StressNonEntrant
)
{
// Open a big window for deopt failure
__
save_frame
(
0
);
__
mov
(
G0
,
L0
);
Label
loop
;
__
bind
(
loop
);
__
sub
(
L0
,
1
,
L0
);
__
br_null_short
(
L0
,
Assembler
::
pt
,
loop
);
__
restore
();
}
__
jmpl
(
G3
,
0
,
G0
);
__
delayed
()
->
nop
();
}
...
...
src/share/vm/ci/ciEnv.cpp
浏览文件 @
30f45144
...
...
@@ -935,7 +935,9 @@ void ciEnv::register_method(ciMethod* target,
// Prevent SystemDictionary::add_to_hierarchy from running
// and invalidating our dependencies until we install this method.
// No safepoints are allowed. Otherwise, class redefinition can occur in between.
MutexLocker
ml
(
Compile_lock
);
No_Safepoint_Verifier
nsv
;
// Change in Jvmti state may invalidate compilation.
if
(
!
failing
()
&&
...
...
@@ -1001,16 +1003,6 @@ void ciEnv::register_method(ciMethod* target,
// Free codeBlobs
code_buffer
->
free_blob
();
// stress test 6243940 by immediately making the method
// non-entrant behind the system's back. This has serious
// side effects on the code cache and is not meant for
// general stress testing
if
(
nm
!=
NULL
&&
StressNonEntrant
)
{
MutexLockerEx
pl
(
Patching_lock
,
Mutex
::
_no_safepoint_check_flag
);
NativeJump
::
patch_verified_entry
(
nm
->
entry_point
(),
nm
->
verified_entry_point
(),
SharedRuntime
::
get_handle_wrong_method_stub
());
}
if
(
nm
==
NULL
)
{
// The CodeCache is full. Print out warning and disable compilation.
record_failure
(
"code cache is full"
);
...
...
@@ -1036,11 +1028,11 @@ void ciEnv::register_method(ciMethod* target,
char
*
method_name
=
method
->
name_and_sig_as_C_string
();
tty
->
print_cr
(
"Replacing method %s"
,
method_name
);
}
if
(
old
!=
NULL
)
{
if
(
old
!=
NULL
)
{
old
->
make_not_entrant
();
}
}
if
(
TraceNMethodInstalls
)
{
if
(
TraceNMethodInstalls
)
{
ResourceMark
rm
;
char
*
method_name
=
method
->
name_and_sig_as_C_string
();
ttyLocker
ttyl
;
...
...
@@ -1051,7 +1043,7 @@ void ciEnv::register_method(ciMethod* target,
// Allow the code to be executed
method
->
set_code
(
method
,
nm
);
}
else
{
if
(
TraceNMethodInstalls
)
{
if
(
TraceNMethodInstalls
)
{
ResourceMark
rm
;
char
*
method_name
=
method
->
name_and_sig_as_C_string
();
ttyLocker
ttyl
;
...
...
@@ -1061,7 +1053,6 @@ void ciEnv::register_method(ciMethod* target,
entry_bci
);
}
method
->
method_holder
()
->
add_osr_nmethod
(
nm
);
}
}
}
...
...
src/share/vm/code/nmethod.cpp
浏览文件 @
30f45144
...
...
@@ -618,21 +618,18 @@ nmethod* nmethod::new_nmethod(methodHandle method,
// record this nmethod as dependent on this klass
InstanceKlass
::
cast
(
klass
)
->
add_dependent_nmethod
(
nm
);
}
}
NOT_PRODUCT
(
if
(
nm
!=
NULL
)
nmethod_stats
.
note_nmethod
(
nm
));
if
(
PrintAssembly
&&
nm
!=
NULL
)
{
Disassembler
::
decode
(
nm
);
NOT_PRODUCT
(
nmethod_stats
.
note_nmethod
(
nm
));
if
(
PrintAssembly
)
{
Disassembler
::
decode
(
nm
);
}
}
}
// verify nmethod
debug_only
(
if
(
nm
)
nm
->
verify
();)
// might block
// Do verification and logging outside CodeCache_lock.
if
(
nm
!=
NULL
)
{
// Safepoints in nmethod::verify aren't allowed because nm hasn't been installed yet.
DEBUG_ONLY
(
nm
->
verify
();)
nm
->
log_new_nmethod
();
}
// done
return
nm
;
}
...
...
@@ -2395,20 +2392,23 @@ void nmethod::verify() {
void
nmethod
::
verify_interrupt_point
(
address
call_site
)
{
// This code does not work in release mode since
// owns_lock only is available in debug mode.
CompiledIC
*
ic
=
NULL
;
Thread
*
cur
=
Thread
::
current
();
if
(
CompiledIC_lock
->
owner
()
==
cur
||
((
cur
->
is_VM_thread
()
||
cur
->
is_ConcurrentGC_thread
())
&&
SafepointSynchronize
::
is_at_safepoint
()))
{
ic
=
CompiledIC_at
(
this
,
call_site
);
CHECK_UNHANDLED_OOPS_ONLY
(
Thread
::
current
()
->
clear_unhandled_oops
());
}
else
{
MutexLocker
ml_verify
(
CompiledIC_lock
);
ic
=
CompiledIC_at
(
this
,
call_site
);
// Verify IC only when nmethod installation is finished.
bool
is_installed
=
(
method
()
->
code
()
==
this
)
// nmethod is in state 'alive' and installed
||
!
this
->
is_in_use
();
// nmethod is installed, but not in 'alive' state
if
(
is_installed
)
{
Thread
*
cur
=
Thread
::
current
();
if
(
CompiledIC_lock
->
owner
()
==
cur
||
((
cur
->
is_VM_thread
()
||
cur
->
is_ConcurrentGC_thread
())
&&
SafepointSynchronize
::
is_at_safepoint
()))
{
CompiledIC_at
(
this
,
call_site
);
CHECK_UNHANDLED_OOPS_ONLY
(
Thread
::
current
()
->
clear_unhandled_oops
());
}
else
{
MutexLocker
ml_verify
(
CompiledIC_lock
);
CompiledIC_at
(
this
,
call_site
);
}
}
PcDesc
*
pd
=
pc_desc_at
(
ic
->
end_of_call
());
PcDesc
*
pd
=
pc_desc_at
(
nativeCall_at
(
call_site
)
->
return_address
());
assert
(
pd
!=
NULL
,
"PcDesc must exist"
);
for
(
ScopeDesc
*
sd
=
new
ScopeDesc
(
this
,
pd
->
scope_decode_offset
(),
pd
->
obj_decode_offset
(),
pd
->
should_reexecute
(),
...
...
src/share/vm/runtime/globals.hpp
浏览文件 @
30f45144
...
...
@@ -3019,9 +3019,6 @@ class CommandLineFlags {
notproduct(intx, ZombieALotInterval, 5, \
"Number of exits until ZombieALot kicks in") \
\
develop(bool, StressNonEntrant, false, \
"Mark nmethods non-entrant at registration") \
\
diagnostic(intx, MallocVerifyInterval, 0, \
"If non-zero, verify C heap after every N calls to " \
"malloc/realloc/free") \
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录