Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_hotspot
提交
91b2821f
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看板
提交
91b2821f
编写于
3月 03, 2011
作者:
D
dcubed
浏览文件
操作
浏览文件
下载
差异文件
Merge
上级
b1004d53
33d974d4
变更
27
隐藏空白更改
内联
并排
Showing
27 changed file
with
346 addition
and
205 deletion
+346
-205
make/windows/makefiles/compile.make
make/windows/makefiles/compile.make
+3
-0
make/windows/makefiles/launcher.make
make/windows/makefiles/launcher.make
+73
-71
src/os/linux/vm/os_linux.cpp
src/os/linux/vm/os_linux.cpp
+1
-1
src/os/posix/vm/os_posix.cpp
src/os/posix/vm/os_posix.cpp
+9
-0
src/os/solaris/vm/os_solaris.cpp
src/os/solaris/vm/os_solaris.cpp
+1
-1
src/os/windows/vm/os_windows.cpp
src/os/windows/vm/os_windows.cpp
+15
-4
src/share/vm/classfile/stackMapFrame.cpp
src/share/vm/classfile/stackMapFrame.cpp
+41
-1
src/share/vm/classfile/stackMapFrame.hpp
src/share/vm/classfile/stackMapFrame.hpp
+2
-0
src/share/vm/classfile/verificationType.hpp
src/share/vm/classfile/verificationType.hpp
+1
-0
src/share/vm/memory/allocation.cpp
src/share/vm/memory/allocation.cpp
+7
-2
src/share/vm/memory/allocation.hpp
src/share/vm/memory/allocation.hpp
+12
-0
src/share/vm/prims/jvmtiExport.cpp
src/share/vm/prims/jvmtiExport.cpp
+12
-9
src/share/vm/prims/jvmtiExport.hpp
src/share/vm/prims/jvmtiExport.hpp
+2
-2
src/share/vm/prims/jvmtiImpl.cpp
src/share/vm/prims/jvmtiImpl.cpp
+25
-59
src/share/vm/prims/jvmtiImpl.hpp
src/share/vm/prims/jvmtiImpl.hpp
+9
-53
src/share/vm/runtime/arguments.cpp
src/share/vm/runtime/arguments.cpp
+18
-0
src/share/vm/runtime/arguments.hpp
src/share/vm/runtime/arguments.hpp
+6
-1
src/share/vm/runtime/globals.hpp
src/share/vm/runtime/globals.hpp
+3
-0
src/share/vm/runtime/java.cpp
src/share/vm/runtime/java.cpp
+3
-0
src/share/vm/runtime/os.hpp
src/share/vm/runtime/os.hpp
+6
-0
src/share/vm/runtime/thread.cpp
src/share/vm/runtime/thread.cpp
+1
-0
src/share/vm/utilities/globalDefinitions_gcc.hpp
src/share/vm/utilities/globalDefinitions_gcc.hpp
+1
-0
src/share/vm/utilities/globalDefinitions_sparcWorks.hpp
src/share/vm/utilities/globalDefinitions_sparcWorks.hpp
+11
-0
src/share/vm/utilities/globalDefinitions_visCPP.hpp
src/share/vm/utilities/globalDefinitions_visCPP.hpp
+9
-0
src/share/vm/utilities/vmError.cpp
src/share/vm/utilities/vmError.cpp
+1
-1
test/runtime/6878713/Test6878713.sh
test/runtime/6878713/Test6878713.sh
+74
-0
test/runtime/6878713/testcase.jar
test/runtime/6878713/testcase.jar
+0
-0
未找到文件。
make/windows/makefiles/compile.make
浏览文件 @
91b2821f
...
...
@@ -207,6 +207,9 @@ LINK_FLAGS = /manifest $(LINK_FLAGS)
# Manifest Tool - used in VS2005 and later to adjust manifests stored
# as resources inside build artifacts.
MT
=
mt.exe
!if
"$(BUILDARCH)"
==
"i486"
LINK_FLAGS
=
/SAFESEH
$(LINK_FLAGS)
!
endif
!
endif
# Compile for space above time.
...
...
make/windows/makefiles/launcher.make
浏览文件 @
91b2821f
#
# Copyright (c) 2010, 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.
#
#
LAUNCHER_FLAGS
=
$(CPP_FLAGS)
$(ARCHFLAG)
\
/D
FULL_VERSION
=
\"
$(HOTSPOT_RELEASE_VERSION)
\"
\
/D
JDK_MAJOR_VERSION
=
\"
$(JDK_MAJOR_VERSION)
\"
\
/D
JDK_MINOR_VERSION
=
\"
$(JDK_MINOR_VERSION)
\"
\
/D
GAMMA
\
/D
LAUNCHER_TYPE
=
\"
gamma
\"
\
/D
_CRT_SECURE_NO_WARNINGS
\
/D
_CRT_SECURE_NO_DEPRECATE
\
/D
LINK_INTO_LIBJVM
\
/I
$(WorkSpace)\src\os\windows\launcher
\
/I
$(WorkSpace)\src\share\tools\launcher
\
/I
$(WorkSpace)\src\share\vm\prims
\
/I
$(WorkSpace)\src\share\vm
\
/I
$(WorkSpace)\src\cpu\$(Platform_arch)\vm
\
/I
$(WorkSpace)\src\os\windows\vm
LINK_FLAGS
=
/manifest
$(HS_INTERNAL_NAME)
.lib kernel32.lib user32.lib /nologo /machine:
$(MACHINE)
/map /debug /subsystem:console
!if
"$(COMPILER_NAME)"
==
"VS2005"
# This VS2005 compiler has /GS as a default and requires bufferoverflowU.lib
# on the link command line, otherwise we get missing __security_check_cookie
# externals at link time. Even with /GS-, you need bufferoverflowU.lib.
BUFFEROVERFLOWLIB
=
bufferoverflowU.lib
LINK_FLAGS
=
$(LINK_FLAGS)
$(BUFFEROVERFLOWLIB)
!endif
LAUNCHERDIR
=
$(WorkSpace)
/src/os/windows/launcher
LAUNCHERDIR_SHARE
=
$(WorkSpace)
/src/share/tools/launcher
OUTDIR
=
launcher
{$(LAUNCHERDIR)}.c{$(OUTDIR)}.obj
:
-
mkdir
$(OUTDIR)
2>NUL
>
NUL
$(CPP)
$(LAUNCHER_FLAGS)
/c
/Fo$@
$<
{$(LAUNCHERDIR_SHARE)}.c{$(OUTDIR)}.obj
:
-
mkdir
$(OUTDIR)
2>NUL
>
NUL
$(CPP)
$(LAUNCHER_FLAGS)
/c
/Fo$@
$<
$(OUTDIR)\*.obj
:
$(LAUNCHERDIR)
\*
.c $(LAUNCHERDIR)
\*
.h $(LAUNCHERDIR_SHARE)
\*
.c $(LAUNCHERDIR_SHARE)
\*
.h
launcher
:
$(OUTDIR)
\j
ava.obj $(OUTDIR)
\j
ava_md.obj $(OUTDIR)
\j
li_util.obj
echo
$(JAVA_HOME)
>
jdkpath.txt
$(LINK)
$(LINK_FLAGS)
/out:hotspot.exe
$*
*
#
# Copyright (c) 2010, 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.
#
#
LAUNCHER_FLAGS
=
$(CPP_FLAGS)
$(ARCHFLAG)
\
/D
FULL_VERSION
=
\"
$(HOTSPOT_RELEASE_VERSION)
\"
\
/D
JDK_MAJOR_VERSION
=
\"
$(JDK_MAJOR_VERSION)
\"
\
/D
JDK_MINOR_VERSION
=
\"
$(JDK_MINOR_VERSION)
\"
\
/D GAMMA
\
/D
LAUNCHER_TYPE
=
\"
gamma
\"
\
/D _CRT_SECURE_NO_WARNINGS
\
/D _CRT_SECURE_NO_DEPRECATE
\
/D LINK_INTO_LIBJVM
\
/I
$(WorkSpace)
\s
rc
\o
s
\w
indows
\l
auncher
\
/I
$(WorkSpace)
\s
rc
\s
hare
\t
ools
\l
auncher
\
/I
$(WorkSpace)
\s
rc
\s
hare
\v
m
\p
rims
\
/I
$(WorkSpace)
\s
rc
\s
hare
\v
m
\
/I
$(WorkSpace)
\s
rc
\c
pu
\$
(
Platform_arch
)
\v
m
\
/I
$(WorkSpace)
\s
rc
\o
s
\w
indows
\v
m
LINK_FLAGS
=
/manifest
$(HS_INTERNAL_NAME)
.lib kernel32.lib user32.lib /nologo /machine:
$(MACHINE)
/map /debug /subsystem:console
!if
"$(COMPILER_NAME)"
==
"VS2005"
# This VS2005 compiler has /GS as a default and requires bufferoverflowU.lib
# on the link command line, otherwise we get missing __security_check_cookie
# externals at link time. Even with /GS-, you need bufferoverflowU.lib.
BUFFEROVERFLOWLIB
=
bufferoverflowU.lib
LINK_FLAGS
=
$(LINK_FLAGS)
$(BUFFEROVERFLOWLIB)
!
endif
!if
"$(COMPILER_NAME)"
==
"VS2010"
&&
"$(BUILDARCH)"
==
"i486"
LINK_FLAGS
=
/SAFESEH
$(LINK_FLAGS)
!
endif
LAUNCHERDIR
=
$(WorkSpace)
/src/os/windows/launcher
LAUNCHERDIR_SHARE
=
$(WorkSpace)
/src/share/tools/launcher
OUTDIR
=
launcher
{$(LAUNCHERDIR)}.c{$(OUTDIR)}.obj
:
-
mkdir
$(OUTDIR)
2>NUL
>
NUL
$(CPP)
$(LAUNCHER_FLAGS)
/c
/Fo$@
$<
{$(LAUNCHERDIR_SHARE)}.c{$(OUTDIR)}.obj
:
-
mkdir
$(OUTDIR)
2>NUL
>
NUL
$(CPP)
$(LAUNCHER_FLAGS)
/c
/Fo$@
$<
$(OUTDIR)\*.obj
:
$(LAUNCHERDIR)
\*
.c $(LAUNCHERDIR)
\*
.h $(LAUNCHERDIR_SHARE)
\*
.c $(LAUNCHERDIR_SHARE)
\*
.h
launcher
:
$(OUTDIR)
\j
ava.obj $(OUTDIR)
\j
ava_md.obj $(OUTDIR)
\j
li_util.obj
echo
$(JAVA_HOME)
>
jdkpath.txt
$(LINK)
$(LINK_FLAGS)
/out:hotspot.exe
$*
*
src/os/linux/vm/os_linux.cpp
浏览文件 @
91b2821f
...
...
@@ -2213,7 +2213,7 @@ void os::jvm_path(char *buf, jint buflen) {
if
(
rp
==
NULL
)
return
;
if
(
strcmp
(
Arguments
::
sun_java_launcher
(),
"gamma"
)
==
0
)
{
if
(
Arguments
::
created_by_gamma_launcher
()
)
{
// Support for the gamma launcher. Typical value for buf is
// "<JAVA_HOME>/jre/lib/<arch>/<vmtype>/libjvm.so". If "/jre/lib/" appears at
// the right place in the string, then assume we are installed in a JDK and
...
...
src/os/posix/vm/os_posix.cpp
浏览文件 @
91b2821f
...
...
@@ -59,3 +59,12 @@ void os::check_or_create_dump(void* exceptionRecord, void* contextRecord, char*
VMError
::
report_coredump_status
(
buffer
,
success
);
}
bool
os
::
is_debugger_attached
()
{
// not implemented
return
false
;
}
void
os
::
wait_for_keypress_at_exit
(
void
)
{
// don't do anything on posix platforms
return
;
}
src/os/solaris/vm/os_solaris.cpp
浏览文件 @
91b2821f
...
...
@@ -2511,7 +2511,7 @@ void os::jvm_path(char *buf, jint buflen) {
assert
(
ret
!=
0
,
"cannot locate libjvm"
);
realpath
((
char
*
)
dlinfo
.
dli_fname
,
buf
);
if
(
strcmp
(
Arguments
::
sun_java_launcher
(),
"gamma"
)
==
0
)
{
if
(
Arguments
::
created_by_gamma_launcher
()
)
{
// Support for the gamma launcher. Typical value for buf is
// "<JAVA_HOME>/jre/lib/<arch>/<vmtype>/libjvm.so". If "/jre/lib/" appears at
// the right place in the string, then assume we are installed in a JDK and
...
...
src/os/windows/vm/os_windows.cpp
浏览文件 @
91b2821f
...
...
@@ -22,10 +22,8 @@
*
*/
#ifdef _WIN64
// Must be at least Windows 2000 or XP to use VectoredExceptions
// Must be at least Windows 2000 or XP to use VectoredExceptions and IsDebuggerPresent
#define _WIN32_WINNT 0x500
#endif
// no precompiled headers
#include "classfile/classLoader.hpp"
...
...
@@ -1788,7 +1786,7 @@ void os::jvm_path(char *buf, jint buflen) {
}
buf
[
0
]
=
'\0'
;
if
(
strcmp
(
Arguments
::
sun_java_launcher
(),
"gamma"
)
==
0
)
{
if
(
Arguments
::
created_by_gamma_launcher
()
)
{
// Support for the gamma launcher. Check for an
// JAVA_HOME environment variable
// and fix up the path so it looks like
...
...
@@ -3418,6 +3416,19 @@ void os::win32::setmode_streams() {
}
bool
os
::
is_debugger_attached
()
{
return
IsDebuggerPresent
()
?
true
:
false
;
}
void
os
::
wait_for_keypress_at_exit
(
void
)
{
if
(
PauseAtExit
)
{
fprintf
(
stderr
,
"Press any key to continue...
\n
"
);
fgetc
(
stdin
);
}
}
int
os
::
message_box
(
const
char
*
title
,
const
char
*
message
)
{
int
result
=
MessageBox
(
NULL
,
message
,
title
,
MB_YESNO
|
MB_ICONERROR
|
MB_SYSTEMMODAL
|
MB_DEFAULT_DESKTOP_ONLY
);
...
...
src/share/vm/classfile/stackMapFrame.cpp
浏览文件 @
91b2821f
...
...
@@ -170,6 +170,44 @@ bool StackMapFrame::is_assignable_to(
return
true
;
}
bool
StackMapFrame
::
has_flag_match_exception
(
const
StackMapFrame
*
target
)
const
{
// We allow flags of {UninitThis} to assign to {} if-and-only-if the
// target frame does not depend upon the current type.
// This is slightly too strict, as we need only enforce that the
// slots that were initialized by the <init> (the things that were
// UninitializedThis before initialize_object() converted them) are unused.
// However we didn't save that information so we'll enforce this upon
// anything that might have been initialized. This is a rare situation
// and javac never generates code that would end up here, but some profilers
// (such as NetBeans) might, when adding exception handlers in <init>
// methods to cover the invokespecial instruction. See 7020118.
assert
(
max_locals
()
==
target
->
max_locals
()
&&
stack_size
()
==
target
->
stack_size
(),
"StackMap sizes must match"
);
VerificationType
top
=
VerificationType
::
top_type
();
VerificationType
this_type
=
verifier
()
->
current_type
();
if
(
!
flag_this_uninit
()
||
target
->
flags
()
!=
0
)
{
return
false
;
}
for
(
int
i
=
0
;
i
<
target
->
locals_size
();
++
i
)
{
if
(
locals
()[
i
]
==
this_type
&&
target
->
locals
()[
i
]
!=
top
)
{
return
false
;
}
}
for
(
int
i
=
0
;
i
<
target
->
stack_size
();
++
i
)
{
if
(
stack
()[
i
]
==
this_type
&&
target
->
stack
()[
i
]
!=
top
)
{
return
false
;
}
}
return
true
;
}
bool
StackMapFrame
::
is_assignable_to
(
const
StackMapFrame
*
target
,
TRAPS
)
const
{
if
(
_max_locals
!=
target
->
max_locals
()
||
_stack_size
!=
target
->
stack_size
())
{
return
false
;
...
...
@@ -182,7 +220,9 @@ bool StackMapFrame::is_assignable_to(const StackMapFrame* target, TRAPS) const {
bool
match_stack
=
is_assignable_to
(
_stack
,
target
->
stack
(),
_stack_size
,
CHECK_false
);
bool
match_flags
=
(
_flags
|
target
->
flags
())
==
target
->
flags
();
return
(
match_locals
&&
match_stack
&&
match_flags
);
return
match_locals
&&
match_stack
&&
(
match_flags
||
has_flag_match_exception
(
target
));
}
VerificationType
StackMapFrame
::
pop_stack_ex
(
VerificationType
type
,
TRAPS
)
{
...
...
src/share/vm/classfile/stackMapFrame.hpp
浏览文件 @
91b2821f
...
...
@@ -228,6 +228,8 @@ class StackMapFrame : public ResourceObj {
bool
is_assignable_to
(
VerificationType
*
src
,
VerificationType
*
target
,
int32_t
len
,
TRAPS
)
const
;
bool
has_flag_match_exception
(
const
StackMapFrame
*
target
)
const
;
// Debugging
void
print
()
const
PRODUCT_RETURN
;
};
...
...
src/share/vm/classfile/verificationType.hpp
浏览文件 @
91b2821f
...
...
@@ -128,6 +128,7 @@ class VerificationType VALUE_OBJ_CLASS_SPEC {
// Create verification types
static
VerificationType
bogus_type
()
{
return
VerificationType
(
Bogus
);
}
static
VerificationType
top_type
()
{
return
bogus_type
();
}
// alias
static
VerificationType
null_type
()
{
return
VerificationType
(
Null
);
}
static
VerificationType
integer_type
()
{
return
VerificationType
(
Integer
);
}
static
VerificationType
float_type
()
{
return
VerificationType
(
Float
);
}
...
...
src/share/vm/memory/allocation.cpp
浏览文件 @
91b2821f
...
...
@@ -422,6 +422,9 @@ size_t Arena::used() const {
return
sum
;
// Return total consumed space.
}
void
Arena
::
signal_out_of_memory
(
size_t
sz
,
const
char
*
whence
)
const
{
vm_exit_out_of_memory
(
sz
,
whence
);
}
// Grow a new Chunk
void
*
Arena
::
grow
(
size_t
x
)
{
...
...
@@ -431,8 +434,9 @@ void* Arena::grow( size_t x ) {
Chunk
*
k
=
_chunk
;
// Get filled-up chunk address
_chunk
=
new
(
len
)
Chunk
(
len
);
if
(
_chunk
==
NULL
)
vm_exit_out_of_memory
(
len
*
Chunk
::
aligned_overhead_size
(),
"Arena::grow"
);
if
(
_chunk
==
NULL
)
{
signal_out_of_memory
(
len
*
Chunk
::
aligned_overhead_size
(),
"Arena::grow"
);
}
if
(
k
)
k
->
set_next
(
_chunk
);
// Append new chunk to end of linked list
else
_first
=
_chunk
;
...
...
@@ -529,6 +533,7 @@ void* Arena::malloc(size_t size) {
// for debugging with UseMallocOnly
void
*
Arena
::
internal_malloc_4
(
size_t
x
)
{
assert
(
(
x
&
(
sizeof
(
char
*
)
-
1
))
==
0
,
"misaligned size"
);
check_for_overflow
(
x
,
"Arena::internal_malloc_4"
);
if
(
_hwm
+
x
>
_max
)
{
return
grow
(
x
);
}
else
{
...
...
src/share/vm/memory/allocation.hpp
浏览文件 @
91b2821f
...
...
@@ -207,6 +207,15 @@ protected:
debug_only
(
void
*
malloc
(
size_t
size
);)
debug_only
(
void
*
internal_malloc_4
(
size_t
x
);)
NOT_PRODUCT
(
void
inc_bytes_allocated
(
size_t
x
);)
void
signal_out_of_memory
(
size_t
request
,
const
char
*
whence
)
const
;
void
check_for_overflow
(
size_t
request
,
const
char
*
whence
)
const
{
if
(
UINTPTR_MAX
-
request
<
(
uintptr_t
)
_hwm
)
{
signal_out_of_memory
(
request
,
whence
);
}
}
public:
Arena
();
Arena
(
size_t
init_size
);
...
...
@@ -220,6 +229,7 @@ protected:
assert
(
is_power_of_2
(
ARENA_AMALLOC_ALIGNMENT
)
,
"should be a power of 2"
);
x
=
ARENA_ALIGN
(
x
);
debug_only
(
if
(
UseMallocOnly
)
return
malloc
(
x
);)
check_for_overflow
(
x
,
"Arena::Amalloc"
);
NOT_PRODUCT
(
inc_bytes_allocated
(
x
);)
if
(
_hwm
+
x
>
_max
)
{
return
grow
(
x
);
...
...
@@ -233,6 +243,7 @@ protected:
void
*
Amalloc_4
(
size_t
x
)
{
assert
(
(
x
&
(
sizeof
(
char
*
)
-
1
))
==
0
,
"misaligned size"
);
debug_only
(
if
(
UseMallocOnly
)
return
malloc
(
x
);)
check_for_overflow
(
x
,
"Arena::Amalloc_4"
);
NOT_PRODUCT
(
inc_bytes_allocated
(
x
);)
if
(
_hwm
+
x
>
_max
)
{
return
grow
(
x
);
...
...
@@ -253,6 +264,7 @@ protected:
size_t
delta
=
(((
size_t
)
_hwm
+
DALIGN_M1
)
&
~
DALIGN_M1
)
-
(
size_t
)
_hwm
;
x
+=
delta
;
#endif
check_for_overflow
(
x
,
"Arena::Amalloc_D"
);
NOT_PRODUCT
(
inc_bytes_allocated
(
x
);)
if
(
_hwm
+
x
>
_max
)
{
return
grow
(
x
);
// grow() returns a result aligned >= 8 bytes.
...
...
src/share/vm/prims/jvmtiExport.cpp
浏览文件 @
91b2821f
...
...
@@ -1805,6 +1805,10 @@ void JvmtiExport::post_compiled_method_load(JvmtiEnv* env, const jmethodID metho
void
JvmtiExport
::
post_dynamic_code_generated_internal
(
const
char
*
name
,
const
void
*
code_begin
,
const
void
*
code_end
)
{
JavaThread
*
thread
=
JavaThread
::
current
();
// In theory everyone coming thru here is in_vm but we need to be certain
// because a callee will do a vm->native transition
ThreadInVMfromUnknown
__tiv
;
EVT_TRIG_TRACE
(
JVMTI_EVENT_DYNAMIC_CODE_GENERATED
,
(
"JVMTI [%s] method dynamic code generated event triggered"
,
JvmtiTrace
::
safe_get_thread_name
(
thread
)));
...
...
@@ -1826,19 +1830,18 @@ void JvmtiExport::post_dynamic_code_generated_internal(const char *name, const v
}
void
JvmtiExport
::
post_dynamic_code_generated
(
const
char
*
name
,
const
void
*
code_begin
,
const
void
*
code_end
)
{
// In theory everyone coming thru here is in_vm but we need to be certain
// because a callee will do a vm->native transition
ThreadInVMfromUnknown
__tiv
;
jvmtiPhase
phase
=
JvmtiEnv
::
get_phase
();
if
(
phase
==
JVMTI_PHASE_PRIMORDIAL
||
phase
==
JVMTI_PHASE_START
)
{
post_dynamic_code_generated_internal
(
name
,
code_begin
,
code_end
);
return
;
}
else
{
// It may not be safe to post the event from this thread. Defer all
// postings to the service thread so that it can perform them in a safe
// context and in-order.
MutexLockerEx
ml
(
Service_lock
,
Mutex
::
_no_safepoint_check_flag
);
JvmtiDeferredEvent
event
=
JvmtiDeferredEvent
::
dynamic_code_generated_event
(
name
,
code_begin
,
code_end
);
JvmtiDeferredEventQueue
::
enqueue
(
event
);
}
// Blocks until everything now in the queue has been posted
JvmtiDeferredEventQueue
::
flush_queue
(
Thread
::
current
());
post_dynamic_code_generated_internal
(
name
,
code_begin
,
code_end
);
}
...
...
src/share/vm/prims/jvmtiExport.hpp
浏览文件 @
91b2821f
...
...
@@ -140,12 +140,12 @@ class JvmtiExport : public AllStatic {
char
sig_type
,
jvalue
*
value
);
private:
// posts a DynamicCodeGenerated event (internal/private implementation).
// The public post_dynamic_code_generated* functions make use of the
// internal implementation.
// internal implementation.
Also called from JvmtiDeferredEvent::post()
static
void
post_dynamic_code_generated_internal
(
const
char
*
name
,
const
void
*
code_begin
,
const
void
*
code_end
)
KERNEL_RETURN
;
private:
// GenerateEvents support to allow posting of CompiledMethodLoad and
// DynamicCodeGenerated events for a given environment.
...
...
src/share/vm/prims/jvmtiImpl.cpp
浏览文件 @
91b2821f
...
...
@@ -918,7 +918,7 @@ void JvmtiSuspendControl::print() {
JvmtiDeferredEvent
JvmtiDeferredEvent
::
compiled_method_load_event
(
nmethod
*
nm
)
{
JvmtiDeferredEvent
event
=
JvmtiDeferredEvent
(
TYPE_COMPILED_METHOD_LOAD
);
event
.
set_compiled_method_load
(
nm
)
;
event
.
_event_data
.
compiled_method_load
=
nm
;
nmethodLocker
::
lock_nmethod
(
nm
);
// will be unlocked when posted
return
event
;
}
...
...
@@ -926,23 +926,39 @@ JvmtiDeferredEvent JvmtiDeferredEvent::compiled_method_load_event(
JvmtiDeferredEvent
JvmtiDeferredEvent
::
compiled_method_unload_event
(
jmethodID
id
,
const
void
*
code
)
{
JvmtiDeferredEvent
event
=
JvmtiDeferredEvent
(
TYPE_COMPILED_METHOD_UNLOAD
);
event
.
set_compiled_method_unload
(
id
,
code
);
event
.
_event_data
.
compiled_method_unload
.
method_id
=
id
;
event
.
_event_data
.
compiled_method_unload
.
code_begin
=
code
;
return
event
;
}
JvmtiDeferredEvent
JvmtiDeferredEvent
::
dynamic_code_generated_event
(
const
char
*
name
,
const
void
*
code_begin
,
const
void
*
code_end
)
{
JvmtiDeferredEvent
event
=
JvmtiDeferredEvent
(
TYPE_DYNAMIC_CODE_GENERATED
);
event
.
_event_data
.
dynamic_code_generated
.
name
=
name
;
event
.
_event_data
.
dynamic_code_generated
.
code_begin
=
code_begin
;
event
.
_event_data
.
dynamic_code_generated
.
code_end
=
code_end
;
return
event
;
}
void
JvmtiDeferredEvent
::
post
()
{
assert
(
ServiceThread
::
is_service_thread
(
Thread
::
current
()),
"Service thread must post enqueued events"
);
switch
(
_type
)
{
case
TYPE_COMPILED_METHOD_LOAD
:
JvmtiExport
::
post_compiled_method_load
(
compiled_method_load
());
nmethodLocker
::
unlock_nmethod
(
compiled_method_load
());
case
TYPE_COMPILED_METHOD_LOAD
:
{
nmethod
*
nm
=
_event_data
.
compiled_method_load
;
JvmtiExport
::
post_compiled_method_load
(
nm
);
nmethodLocker
::
unlock_nmethod
(
nm
);
break
;
}
case
TYPE_COMPILED_METHOD_UNLOAD
:
JvmtiExport
::
post_compiled_method_unload
(
compiled_method_unload_method_id
()
,
compiled_method_unload_code_begin
()
);
_event_data
.
compiled_method_unload
.
method_id
,
_event_data
.
compiled_method_unload
.
code_begin
);
break
;
case
TYPE_FLUSH
:
JvmtiDeferredEventQueue
::
flush_complete
(
flush_state_addr
());
case
TYPE_DYNAMIC_CODE_GENERATED
:
JvmtiExport
::
post_dynamic_code_generated_internal
(
_event_data
.
dynamic_code_generated
.
name
,
_event_data
.
dynamic_code_generated
.
code_begin
,
_event_data
.
dynamic_code_generated
.
code_end
);
break
;
default:
ShouldNotReachHere
();
...
...
@@ -1065,54 +1081,4 @@ void JvmtiDeferredEventQueue::process_pending_events() {
}
}
enum
{
// Random - used for debugging
FLUSHING
=
0x50403020
,
FLUSHED
=
0x09080706
};
void
JvmtiDeferredEventQueue
::
flush_queue
(
Thread
*
thread
)
{
volatile
int
flush_state
=
FLUSHING
;
JvmtiDeferredEvent
flush
(
JvmtiDeferredEvent
::
TYPE_FLUSH
);
flush
.
set_flush_state_addr
((
int
*
)
&
flush_state
);
if
(
ServiceThread
::
is_service_thread
(
thread
))
{
// If we are the service thread we have to post all preceding events
// Use the flush event as a token to indicate when we can stop
JvmtiDeferredEvent
event
;
{
MutexLockerEx
ml
(
Service_lock
,
Mutex
::
_no_safepoint_check_flag
);
enqueue
(
flush
);
event
=
dequeue
();
}
while
(
!
event
.
is_flush_event
()
||
event
.
flush_state_addr
()
!=
&
flush_state
)
{
event
.
post
();
{
MutexLockerEx
ml
(
Service_lock
,
Mutex
::
_no_safepoint_check_flag
);
event
=
dequeue
();
}
}
}
else
{
// Wake up the service thread so it will process events. When it gets
// to the flush event it will set 'flush_complete' and notify us.
MutexLockerEx
ml
(
Service_lock
,
Mutex
::
_no_safepoint_check_flag
);
enqueue
(
flush
);
while
(
flush_state
!=
FLUSHED
)
{
assert
(
flush_state
==
FLUSHING
||
flush_state
==
FLUSHED
,
"only valid values for this"
);
Service_lock
->
wait
(
Mutex
::
_no_safepoint_check_flag
);
}
}
}
void
JvmtiDeferredEventQueue
::
flush_complete
(
int
*
state_addr
)
{
assert
(
state_addr
!=
NULL
&&
*
state_addr
==
FLUSHING
,
"must be"
);
MutexLockerEx
ml
(
Service_lock
,
Mutex
::
_no_safepoint_check_flag
);
*
state_addr
=
FLUSHED
;
Service_lock
->
notify_all
();
}
#endif // ndef KERNEL
src/share/vm/prims/jvmtiImpl.hpp
浏览文件 @
91b2821f
...
...
@@ -451,7 +451,7 @@ class JvmtiDeferredEvent VALUE_OBJ_CLASS_SPEC {
TYPE_NONE
,
TYPE_COMPILED_METHOD_LOAD
,
TYPE_COMPILED_METHOD_UNLOAD
,
TYPE_
FLUSH
// pseudo-event used to implement flush_queue()
TYPE_
DYNAMIC_CODE_GENERATED
}
Type
;
Type
_type
;
...
...
@@ -461,49 +461,15 @@ class JvmtiDeferredEvent VALUE_OBJ_CLASS_SPEC {
jmethodID
method_id
;
const
void
*
code_begin
;
}
compiled_method_unload
;
int
*
flush_state_addr
;
struct
{
const
char
*
name
;
const
void
*
code_begin
;
const
void
*
code_end
;
}
dynamic_code_generated
;
}
_event_data
;
JvmtiDeferredEvent
(
Type
t
)
:
_type
(
t
)
{}
void
set_compiled_method_load
(
nmethod
*
nm
)
{
assert
(
_type
==
TYPE_COMPILED_METHOD_LOAD
,
"must be"
);
_event_data
.
compiled_method_load
=
nm
;
}
nmethod
*
compiled_method_load
()
const
{
assert
(
_type
==
TYPE_COMPILED_METHOD_LOAD
,
"must be"
);
return
_event_data
.
compiled_method_load
;
}
void
set_compiled_method_unload
(
jmethodID
id
,
const
void
*
code
)
{
assert
(
_type
==
TYPE_COMPILED_METHOD_UNLOAD
,
"must be"
);
_event_data
.
compiled_method_unload
.
method_id
=
id
;
_event_data
.
compiled_method_unload
.
code_begin
=
code
;
}
jmethodID
compiled_method_unload_method_id
()
const
{
assert
(
_type
==
TYPE_COMPILED_METHOD_UNLOAD
,
"must be"
);
return
_event_data
.
compiled_method_unload
.
method_id
;
}
const
void
*
compiled_method_unload_code_begin
()
const
{
assert
(
_type
==
TYPE_COMPILED_METHOD_UNLOAD
,
"must be"
);
return
_event_data
.
compiled_method_unload
.
code_begin
;
}
bool
is_flush_event
()
const
{
return
_type
==
TYPE_FLUSH
;
}
int
*
flush_state_addr
()
const
{
assert
(
is_flush_event
(),
"must be"
);
return
_event_data
.
flush_state_addr
;
}
void
set_flush_state_addr
(
int
*
flag
)
{
assert
(
is_flush_event
(),
"must be"
);
_event_data
.
flush_state_addr
=
flag
;
}
public:
JvmtiDeferredEvent
()
:
_type
(
TYPE_NONE
)
{}
...
...
@@ -513,6 +479,9 @@ class JvmtiDeferredEvent VALUE_OBJ_CLASS_SPEC {
KERNEL_RETURN_
(
JvmtiDeferredEvent
());
static
JvmtiDeferredEvent
compiled_method_unload_event
(
jmethodID
id
,
const
void
*
code
)
KERNEL_RETURN_
(
JvmtiDeferredEvent
());
static
JvmtiDeferredEvent
dynamic_code_generated_event
(
const
char
*
name
,
const
void
*
begin
,
const
void
*
end
)
KERNEL_RETURN_
(
JvmtiDeferredEvent
());
// Actually posts the event.
void
post
()
KERNEL_RETURN
;
...
...
@@ -548,25 +517,12 @@ class JvmtiDeferredEventQueue : AllStatic {
// Transfers events from the _pending_list to the _queue.
static
void
process_pending_events
()
KERNEL_RETURN
;
static
void
flush_complete
(
int
*
flush_state
)
KERNEL_RETURN
;
public:
// Must be holding Service_lock when calling these
static
bool
has_events
()
KERNEL_RETURN_
(
false
);
static
void
enqueue
(
const
JvmtiDeferredEvent
&
event
)
KERNEL_RETURN
;
static
JvmtiDeferredEvent
dequeue
()
KERNEL_RETURN_
(
JvmtiDeferredEvent
());
// This call blocks until all events enqueued prior to this call
// have been posted. The Service_lock is acquired and waited upon.
//
// Implemented by creating a "flush" event and placing it in the queue.
// When the flush event is "posted" it will call flush_complete(), which
// will release the caller.
//
// Can be called by any thread (maybe even the service thread itself).
// Not necessary for the caller to be a JavaThread.
static
void
flush_queue
(
Thread
*
current
)
KERNEL_RETURN
;
// Used to enqueue events without using a lock, for times (such as during
// safepoint) when we can't or don't want to lock the Service_lock.
//
...
...
src/share/vm/runtime/arguments.cpp
浏览文件 @
91b2821f
...
...
@@ -78,6 +78,7 @@ bool Arguments::_xdebug_mode = false;
const
char
*
Arguments
::
_java_vendor_url_bug
=
DEFAULT_VENDOR_URL_BUG
;
const
char
*
Arguments
::
_sun_java_launcher
=
DEFAULT_JAVA_LAUNCHER
;
int
Arguments
::
_sun_java_launcher_pid
=
-
1
;
bool
Arguments
::
_created_by_gamma_launcher
=
false
;
// These parameters are reset in method parse_vm_init_args(JavaVMInitArgs*)
bool
Arguments
::
_AlwaysCompileLoopMethods
=
AlwaysCompileLoopMethods
;
...
...
@@ -1656,6 +1657,9 @@ void Arguments::process_java_compiler_argument(char* arg) {
void
Arguments
::
process_java_launcher_argument
(
const
char
*
launcher
,
void
*
extra_info
)
{
_sun_java_launcher
=
strdup
(
launcher
);
if
(
strcmp
(
"gamma"
,
_sun_java_launcher
)
==
0
)
{
_created_by_gamma_launcher
=
true
;
}
}
bool
Arguments
::
created_by_java_launcher
()
{
...
...
@@ -1663,6 +1667,10 @@ bool Arguments::created_by_java_launcher() {
return
strcmp
(
DEFAULT_JAVA_LAUNCHER
,
_sun_java_launcher
)
!=
0
;
}
bool
Arguments
::
created_by_gamma_launcher
()
{
return
_created_by_gamma_launcher
;
}
//===========================================================================================================
// Parsing of main arguments
...
...
@@ -3155,6 +3163,16 @@ jint Arguments::parse(const JavaVMInitArgs* args) {
}
}
// set PauseAtExit if the gamma launcher was used and a debugger is attached
// but only if not already set on the commandline
if
(
Arguments
::
created_by_gamma_launcher
()
&&
os
::
is_debugger_attached
())
{
bool
set
=
false
;
CommandLineFlags
::
wasSetOnCmdline
(
"PauseAtExit"
,
&
set
);
if
(
!
set
)
{
FLAG_SET_DEFAULT
(
PauseAtExit
,
true
);
}
}
return
JNI_OK
;
}
...
...
src/share/vm/runtime/arguments.hpp
浏览文件 @
91b2821f
/*
* Copyright (c) 1997, 201
0
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 201
1
, 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
...
...
@@ -257,6 +257,9 @@ class Arguments : AllStatic {
// sun.java.launcher.pid, private property
static
int
_sun_java_launcher_pid
;
// was this VM created by the gamma launcher
static
bool
_created_by_gamma_launcher
;
// Option flags
static
bool
_has_profile
;
static
bool
_has_alloc_profile
;
...
...
@@ -444,6 +447,8 @@ class Arguments : AllStatic {
static
const
char
*
sun_java_launcher
()
{
return
_sun_java_launcher
;
}
// Was VM created by a Java launcher?
static
bool
created_by_java_launcher
();
// Was VM created by the gamma Java launcher?
static
bool
created_by_gamma_launcher
();
// -Dsun.java.launcher.pid
static
int
sun_java_launcher_pid
()
{
return
_sun_java_launcher_pid
;
}
...
...
src/share/vm/runtime/globals.hpp
浏览文件 @
91b2821f
...
...
@@ -3733,6 +3733,9 @@ class CommandLineFlags {
"The file to create and for whose removal to await when pausing " \
"at startup. (default: ./vm.paused.<pid>)") \
\
diagnostic(bool, PauseAtExit, false, \
"Pause and wait for keypress on exit if a debugger is attached") \
\
product(bool, ExtendedDTraceProbes, false, \
"Enable performance-impacting dtrace probes") \
\
...
...
src/share/vm/runtime/java.cpp
浏览文件 @
91b2821f
...
...
@@ -551,6 +551,7 @@ void notify_vm_shutdown() {
void
vm_direct_exit
(
int
code
)
{
notify_vm_shutdown
();
os
::
wait_for_keypress_at_exit
();
::
exit
(
code
);
}
...
...
@@ -577,11 +578,13 @@ void vm_perform_shutdown_actions() {
void
vm_shutdown
()
{
vm_perform_shutdown_actions
();
os
::
wait_for_keypress_at_exit
();
os
::
shutdown
();
}
void
vm_abort
(
bool
dump_core
)
{
vm_perform_shutdown_actions
();
os
::
wait_for_keypress_at_exit
();
os
::
abort
(
dump_core
);
ShouldNotReachHere
();
}
...
...
src/share/vm/runtime/os.hpp
浏览文件 @
91b2821f
...
...
@@ -492,6 +492,12 @@ class os: AllStatic {
static
void
print_location
(
outputStream
*
st
,
intptr_t
x
,
bool
verbose
=
false
);
static
size_t
lasterror
(
char
*
buf
,
size_t
len
);
// Determines whether the calling process is being debugged by a user-mode debugger.
static
bool
is_debugger_attached
();
// wait for a key press if PauseAtExit is set
static
void
wait_for_keypress_at_exit
(
void
);
// The following two functions are used by fatal error handler to trace
// native (C) frames. They are not part of frame.hpp/frame.cpp because
// frame.hpp/cpp assume thread is JavaThread, and also because different
...
...
src/share/vm/runtime/thread.cpp
浏览文件 @
91b2821f
...
...
@@ -3644,6 +3644,7 @@ bool Threads::destroy_vm() {
if
(
ShowMessageBoxOnError
&&
is_error_reported
())
{
os
::
infinite_sleep
();
}
os
::
wait_for_keypress_at_exit
();
if
(
JDK_Version
::
is_jdk12x_version
())
{
// We are the last thread running, so check if finalizers should be run.
...
...
src/share/vm/utilities/globalDefinitions_gcc.hpp
浏览文件 @
91b2821f
...
...
@@ -77,6 +77,7 @@
# endif
#ifdef LINUX
#define __STDC_LIMIT_MACROS
#include <inttypes.h>
#include <signal.h>
#include <ucontext.h>
...
...
src/share/vm/utilities/globalDefinitions_sparcWorks.hpp
浏览文件 @
91b2821f
...
...
@@ -148,6 +148,17 @@ typedef unsigned int uintptr_t;
#endif
#endif
// On solaris 8, UINTPTR_MAX is defined as empty.
// Everywhere else it's an actual value.
#if UINTPTR_MAX - 1 == -1
#undef UINTPTR_MAX
#ifdef _LP64
#define UINTPTR_MAX UINT64_MAX
#else
#define UINTPTR_MAX UINT32_MAX
#endif
/* ifdef _LP64 */
#endif
// Additional Java basic types
typedef
unsigned
char
jubyte
;
...
...
src/share/vm/utilities/globalDefinitions_visCPP.hpp
浏览文件 @
91b2821f
...
...
@@ -41,6 +41,7 @@
# include <stdio.h> // for va_list
# include <time.h>
# include <fcntl.h>
# include <limits.h>
// Need this on windows to get the math constants (e.g., M_PI).
#define _USE_MATH_DEFINES
# include <math.h>
...
...
@@ -99,6 +100,14 @@ typedef signed int intptr_t;
typedef
signed
int
ssize_t
;
#endif
#ifndef UINTPTR_MAX
#ifdef _WIN64
#define UINTPTR_MAX _UI64_MAX
#else
#define UINTPTR_MAX _UI32_MAX
#endif
#endif
//----------------------------------------------------------------------------------------------------
// Additional Java basic types
...
...
src/share/vm/utilities/vmError.cpp
浏览文件 @
91b2821f
...
...
@@ -802,7 +802,7 @@ void VMError::report_and_die() {
first_error_tid
=
mytid
;
set_error_reported
();
if
(
ShowMessageBoxOnError
)
{
if
(
ShowMessageBoxOnError
||
PauseAtExit
)
{
show_message_box
(
buffer
,
sizeof
(
buffer
));
// User has asked JVM to abort. Reset ShowMessageBoxOnError so the
...
...
test/runtime/6878713/Test6878713.sh
0 → 100644
浏览文件 @
91b2821f
#!/bin/sh
##
## @test
## @bug 6878713
## @summary Verifier heap corruption, relating to backward jsrs
## @run shell/timeout=120 Test6878713.sh
##
if
[
"
${
TESTSRC
}
"
=
""
]
then
TESTSRC
=
.
fi
if
[
"
${
TESTJAVA
}
"
=
""
]
then
PARENT
=
`
dirname
\`
which java
\`
`
TESTJAVA
=
`
dirname
${
PARENT
}
`
echo
"TESTJAVA not set, selecting "
${
TESTJAVA
}
echo
"If this is incorrect, try setting the variable manually."
fi
if
[
"
${
TESTCLASSES
}
"
=
""
]
then
echo
"TESTCLASSES not set. Test cannot execute. Failed."
exit
1
fi
BIT_FLAG
=
""
# set platform-dependent variables
OS
=
`
uname
-s
`
case
"
$OS
"
in
SunOS
|
Linux
)
NULL
=
/dev/null
PS
=
":"
FS
=
"/"
## for solaris, linux it's HOME
FILE_LOCATION
=
$HOME
if
[
-f
${
FILE_LOCATION
}${
FS
}
JDK64BIT
-a
${
OS
}
=
"SunOS"
]
then
BIT_FLAG
=
`
cat
${
FILE_LOCATION
}${
FS
}
JDK64BIT |
grep
-v
'^#'
`
fi
;;
Windows_
*
)
NULL
=
NUL
PS
=
";"
FS
=
"
\\
"
;;
*
)
echo
"Unrecognized system!"
exit
1
;
;;
esac
JEMMYPATH
=
${
CPAPPEND
}
CLASSPATH
=
.
${
PS
}${
TESTCLASSES
}${
PS
}${
JEMMYPATH
}
;
export
CLASSPATH
THIS_DIR
=
`
pwd
`
${
TESTJAVA
}${
FS
}
bin
${
FS
}
java
${
BIT_FLAG
}
-version
${
TESTJAVA
}${
FS
}
bin
${
FS
}
jar xvf
${
TESTSRC
}${
FS
}
testcase.jar
${
TESTJAVA
}${
FS
}
bin
${
FS
}
java
${
BIT_FLAG
}
OOMCrashClass1960_2
>
test.out 2>&1
if
[
-s
core
-o
-s
"hs_*.log"
]
then
cat
hs
*
.log
echo
"Test Failed"
exit
1
else
echo
"Test Passed"
exit
0
fi
test/runtime/6878713/testcase.jar
0 → 100644
浏览文件 @
91b2821f
文件已添加
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录