Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_hotspot
提交
06939246
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看板
提交
06939246
编写于
1月 11, 2013
作者:
Z
zgu
浏览文件
操作
浏览文件
下载
差异文件
Merge
上级
46be0cea
57b0e93f
变更
19
展开全部
隐藏空白更改
内联
并排
Showing
19 changed file
with
368 addition
and
468 deletion
+368
-468
src/cpu/sparc/vm/vmStructs_sparc.hpp
src/cpu/sparc/vm/vmStructs_sparc.hpp
+5
-24
src/cpu/x86/vm/vmStructs_x86.hpp
src/cpu/x86/vm/vmStructs_x86.hpp
+5
-22
src/cpu/zero/vm/vmStructs_zero.hpp
src/cpu/zero/vm/vmStructs_zero.hpp
+4
-20
src/os/windows/vm/decoder_windows.cpp
src/os/windows/vm/decoder_windows.cpp
+75
-3
src/os/windows/vm/decoder_windows.hpp
src/os/windows/vm/decoder_windows.hpp
+2
-0
src/os_cpu/bsd_x86/vm/vmStructs_bsd_x86.hpp
src/os_cpu/bsd_x86/vm/vmStructs_bsd_x86.hpp
+6
-17
src/os_cpu/bsd_zero/vm/vmStructs_bsd_zero.hpp
src/os_cpu/bsd_zero/vm/vmStructs_bsd_zero.hpp
+4
-12
src/os_cpu/linux_sparc/vm/vmStructs_linux_sparc.hpp
src/os_cpu/linux_sparc/vm/vmStructs_linux_sparc.hpp
+7
-18
src/os_cpu/linux_x86/vm/vmStructs_linux_x86.hpp
src/os_cpu/linux_x86/vm/vmStructs_linux_x86.hpp
+6
-17
src/os_cpu/linux_zero/vm/vmStructs_linux_zero.hpp
src/os_cpu/linux_zero/vm/vmStructs_linux_zero.hpp
+4
-13
src/os_cpu/solaris_sparc/vm/vmStructs_solaris_sparc.hpp
src/os_cpu/solaris_sparc/vm/vmStructs_solaris_sparc.hpp
+7
-19
src/os_cpu/solaris_x86/vm/vmStructs_solaris_x86.hpp
src/os_cpu/solaris_x86/vm/vmStructs_solaris_x86.hpp
+6
-18
src/os_cpu/windows_x86/vm/vmStructs_windows_x86.hpp
src/os_cpu/windows_x86/vm/vmStructs_windows_x86.hpp
+6
-17
src/share/vm/classfile/classFileParser.cpp
src/share/vm/classfile/classFileParser.cpp
+33
-7
src/share/vm/classfile/placeholders.cpp
src/share/vm/classfile/placeholders.cpp
+7
-5
src/share/vm/classfile/placeholders.hpp
src/share/vm/classfile/placeholders.hpp
+6
-4
src/share/vm/classfile/systemDictionary.cpp
src/share/vm/classfile/systemDictionary.cpp
+57
-117
src/share/vm/runtime/vmStructs.cpp
src/share/vm/runtime/vmStructs.cpp
+126
-134
src/share/vm/utilities/exceptions.hpp
src/share/vm/utilities/exceptions.hpp
+2
-1
未找到文件。
src/cpu/sparc/vm/vmStructs_sparc.hpp
浏览文件 @
06939246
...
...
@@ -29,7 +29,7 @@
// constants required by the Serviceability Agent. This file is
// referenced by vmStructs.cpp.
#define VM_STRUCTS_CPU(nonstatic_field, static_field, unchecked_nonstatic_field, volatile_nonstatic_field, nonproduct_nonstatic_field, c2_nonstatic_field, unchecked_c1_static_field, unchecked_c2_static_field
, last_entry
) \
#define VM_STRUCTS_CPU(nonstatic_field, static_field, unchecked_nonstatic_field, volatile_nonstatic_field, nonproduct_nonstatic_field, c2_nonstatic_field, unchecked_c1_static_field, unchecked_c2_static_field) \
\
/******************************/
\
/* JavaCallWrapper */
\
...
...
@@ -37,22 +37,12 @@
/******************************/
\
/* JavaFrameAnchor */
\
/******************************/
\
volatile_nonstatic_field(JavaFrameAnchor, _flags, int) \
\
volatile_nonstatic_field(JavaFrameAnchor, _flags, int)
/* NOTE that we do not use the last_entry() macro here; it is used */
/* in vmStructs_<os>_<cpu>.hpp's VM_STRUCTS_OS_CPU macro (and must */
/* be present there) */
#define VM_TYPES_CPU(declare_type, declare_toplevel_type, declare_oop_type, declare_integer_type, declare_unsigned_integer_type, declare_c1_toplevel_type, declare_c2_type, declare_c2_toplevel_type)
#define VM_TYPES_CPU(declare_type, declare_toplevel_type, declare_oop_type, declare_integer_type, declare_unsigned_integer_type, declare_c1_toplevel_type, declare_c2_type, declare_c2_toplevel_type, last_entry) \
/* NOTE that we do not use the last_entry() macro here; it is used */
/* in vmStructs_<os>_<cpu>.hpp's VM_TYPES_OS_CPU macro (and must */
/* be present there) */
#define VM_INT_CONSTANTS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant, last_entry) \
#define VM_INT_CONSTANTS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant) \
/******************************/
\
/* Register numbers (C2 only) */
\
/******************************/
\
...
...
@@ -90,15 +80,6 @@
declare_c2_constant(R_G6_num) \
declare_c2_constant(R_G7_num)
/* NOTE that we do not use the last_entry() macro here; it is used */
/* in vmStructs_<os>_<cpu>.hpp's VM_INT_CONSTANTS_OS_CPU macro (and must */
/* be present there) */
#define VM_LONG_CONSTANTS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant, last_entry) \
/* NOTE that we do not use the last_entry() macro here; it is used */
/* in vmStructs_<os>_<cpu>.hpp's VM_LONG_CONSTANTS_OS_CPU macro (and must */
/* be present there) */
#define VM_LONG_CONSTANTS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant)
#endif // CPU_SPARC_VM_VMSTRUCTS_SPARC_HPP
src/cpu/x86/vm/vmStructs_x86.hpp
浏览文件 @
06939246
...
...
@@ -29,7 +29,7 @@
// constants required by the Serviceability Agent. This file is
// referenced by vmStructs.cpp.
#define VM_STRUCTS_CPU(nonstatic_field, static_field, unchecked_nonstatic_field, volatile_nonstatic_field, nonproduct_nonstatic_field, c2_nonstatic_field, unchecked_c1_static_field, unchecked_c2_static_field
, last_entry
) \
#define VM_STRUCTS_CPU(nonstatic_field, static_field, unchecked_nonstatic_field, volatile_nonstatic_field, nonproduct_nonstatic_field, c2_nonstatic_field, unchecked_c1_static_field, unchecked_c2_static_field) \
\
/******************************/
\
/* JavaCallWrapper */
\
...
...
@@ -37,31 +37,14 @@
/******************************/
\
/* JavaFrameAnchor */
\
/******************************/
\
volatile_nonstatic_field(JavaFrameAnchor, _last_Java_fp, intptr_t*) \
\
/* NOTE that we do not use the last_entry() macro here; it is used */
/* in vmStructs_<os>_<cpu>.hpp's VM_STRUCTS_OS_CPU macro (and must */
/* be present there) */
#define VM_TYPES_CPU(declare_type, declare_toplevel_type, declare_oop_type, declare_integer_type, declare_unsigned_integer_type, declare_c1_toplevel_type, declare_c2_type, declare_c2_toplevel_type, last_entry) \
/* NOTE that we do not use the last_entry() macro here; it is used */
/* in vmStructs_<os>_<cpu>.hpp's VM_TYPES_OS_CPU macro (and must */
/* be present there) */
volatile_nonstatic_field(JavaFrameAnchor, _last_Java_fp, intptr_t*)
#define VM_INT_CONSTANTS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant, last_entry) \
/* NOTE that we do not use the last_entry() macro here; it is used */
/* in vmStructs_<os>_<cpu>.hpp's VM_INT_CONSTANTS_OS_CPU macro (and must */
/* be present there) */
#define VM_TYPES_CPU(declare_type, declare_toplevel_type, declare_oop_type, declare_integer_type, declare_unsigned_integer_type, declare_c1_toplevel_type, declare_c2_type, declare_c2_toplevel_type)
#define VM_
LONG_CONSTANTS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant, last_entry) \
#define VM_
INT_CONSTANTS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant)
/* NOTE that we do not use the last_entry() macro here; it is used */
/* in vmStructs_<os>_<cpu>.hpp's VM_LONG_CONSTANTS_OS_CPU macro (and must */
/* be present there) */
#define VM_LONG_CONSTANTS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant)
#endif // CPU_X86_VM_VMSTRUCTS_X86_HPP
src/cpu/zero/vm/vmStructs_zero.hpp
浏览文件 @
06939246
...
...
@@ -30,28 +30,12 @@
// constants required by the Serviceability Agent. This file is
// referenced by vmStructs.cpp.
#define VM_STRUCTS_CPU(nonstatic_field, static_field, unchecked_nonstatic_field, volatile_nonstatic_field, nonproduct_nonstatic_field, c2_nonstatic_field, unchecked_c1_static_field, unchecked_c2_static_field
, last_entry) \
#define VM_STRUCTS_CPU(nonstatic_field, static_field, unchecked_nonstatic_field, volatile_nonstatic_field, nonproduct_nonstatic_field, c2_nonstatic_field, unchecked_c1_static_field, unchecked_c2_static_field
)
/* NOTE that we do not use the last_entry() macro here; it is used */
/* in vmStructs_<os>_<cpu>.hpp's VM_STRUCTS_OS_CPU macro (and must */
/* be present there) */
#define VM_TYPES_CPU(declare_type, declare_toplevel_type, declare_oop_type, declare_integer_type, declare_unsigned_integer_type, declare_c1_toplevel_type, declare_c2_type, declare_c2_toplevel_type)
#define VM_
TYPES_CPU(declare_type, declare_toplevel_type, declare_oop_type, declare_integer_type, declare_unsigned_integer_type, declare_c1_toplevel_type, declare_c2_type, declare_c2_toplevel_type, last_entry) \
#define VM_
INT_CONSTANTS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant)
/* NOTE that we do not use the last_entry() macro here; it is used */
/* in vmStructs_<os>_<cpu>.hpp's VM_TYPES_OS_CPU macro (and must */
/* be present there) */
#define VM_INT_CONSTANTS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant, last_entry) \
/* NOTE that we do not use the last_entry() macro here; it is used */
/* in vmStructs_<os>_<cpu>.hpp's VM_INT_CONSTANTS_OS_CPU macro (and must */
/* be present there) */
#define VM_LONG_CONSTANTS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant, last_entry) \
/* NOTE that we do not use the last_entry() macro here; it is used */
/* in vmStructs_<os>_<cpu>.hpp's VM_LONG_CONSTANTS_OS_CPU macro (and must */
/* be present there) */
#define VM_LONG_CONSTANTS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant)
#endif // CPU_ZERO_VM_VMSTRUCTS_ZERO_HPP
src/os/windows/vm/decoder_windows.cpp
浏览文件 @
06939246
...
...
@@ -49,7 +49,7 @@ void WindowsDecoder::initialize() {
pfn_SymSetOptions
_pfnSymSetOptions
=
(
pfn_SymSetOptions
)
::
GetProcAddress
(
handle
,
"SymSetOptions"
);
pfn_SymInitialize
_pfnSymInitialize
=
(
pfn_SymInitialize
)
::
GetProcAddress
(
handle
,
"SymInitialize"
);
_pfnSymGetSymFromAddr64
=
(
pfn_SymGetSymFromAddr64
)
::
GetProcAddress
(
handle
,
"SymGetSymFromAddr64"
);
_pfnUndecorateSymbolName
=
(
pfn_UndecorateSymbolName
)
GetProcAddress
(
handle
,
"UnDecorateSymbolName"
);
_pfnUndecorateSymbolName
=
(
pfn_UndecorateSymbolName
)
::
GetProcAddress
(
handle
,
"UnDecorateSymbolName"
);
if
(
_pfnSymSetOptions
==
NULL
||
_pfnSymInitialize
==
NULL
||
_pfnSymGetSymFromAddr64
==
NULL
)
{
_pfnSymGetSymFromAddr64
=
NULL
;
...
...
@@ -60,8 +60,9 @@ void WindowsDecoder::initialize() {
return
;
}
_pfnSymSetOptions
(
SYMOPT_UNDNAME
|
SYMOPT_DEFERRED_LOADS
);
if
(
!
_pfnSymInitialize
(
GetCurrentProcess
(),
NULL
,
TRUE
))
{
HANDLE
hProcess
=
::
GetCurrentProcess
();
_pfnSymSetOptions
(
SYMOPT_UNDNAME
|
SYMOPT_DEFERRED_LOADS
|
SYMOPT_EXACT_SYMBOLS
);
if
(
!
_pfnSymInitialize
(
hProcess
,
NULL
,
TRUE
))
{
_pfnSymGetSymFromAddr64
=
NULL
;
_pfnUndecorateSymbolName
=
NULL
;
::
FreeLibrary
(
handle
);
...
...
@@ -70,6 +71,77 @@ void WindowsDecoder::initialize() {
return
;
}
// set pdb search paths
pfn_SymSetSearchPath
_pfn_SymSetSearchPath
=
(
pfn_SymSetSearchPath
)
::
GetProcAddress
(
handle
,
"SymSetSearchPath"
);
pfn_SymGetSearchPath
_pfn_SymGetSearchPath
=
(
pfn_SymGetSearchPath
)
::
GetProcAddress
(
handle
,
"SymGetSearchPath"
);
if
(
_pfn_SymSetSearchPath
!=
NULL
&&
_pfn_SymGetSearchPath
!=
NULL
)
{
char
paths
[
MAX_PATH
];
int
len
=
sizeof
(
paths
);
if
(
!
_pfn_SymGetSearchPath
(
hProcess
,
paths
,
len
))
{
paths
[
0
]
=
'\0'
;
}
else
{
// available spaces in path buffer
len
-=
(
int
)
strlen
(
paths
);
}
char
tmp_path
[
MAX_PATH
];
DWORD
dwSize
;
HMODULE
hJVM
=
::
GetModuleHandle
(
"jvm.dll"
);
tmp_path
[
0
]
=
'\0'
;
// append the path where jvm.dll is located
if
(
hJVM
!=
NULL
&&
(
dwSize
=
::
GetModuleFileName
(
hJVM
,
tmp_path
,
sizeof
(
tmp_path
)))
>
0
)
{
while
(
dwSize
>
0
&&
tmp_path
[
dwSize
]
!=
'\\'
)
{
dwSize
--
;
}
tmp_path
[
dwSize
]
=
'\0'
;
if
(
dwSize
>
0
&&
len
>
(
int
)
dwSize
+
1
)
{
strncat
(
paths
,
os
::
path_separator
(),
1
);
strncat
(
paths
,
tmp_path
,
dwSize
);
len
-=
dwSize
+
1
;
}
}
// append $JRE/bin. Arguments::get_java_home actually returns $JRE
// path
char
*
p
=
Arguments
::
get_java_home
();
assert
(
p
!=
NULL
,
"empty java home"
);
size_t
java_home_len
=
strlen
(
p
);
if
(
len
>
(
int
)
java_home_len
+
5
)
{
strncat
(
paths
,
os
::
path_separator
(),
1
);
strncat
(
paths
,
p
,
java_home_len
);
strncat
(
paths
,
"
\\
bin"
,
4
);
len
-=
(
int
)(
java_home_len
+
5
);
}
// append $JDK/bin path if it exists
assert
(
java_home_len
<
MAX_PATH
,
"Invalid path length"
);
// assume $JRE is under $JDK, construct $JDK/bin path and
// see if it exists or not
if
(
strncmp
(
&
p
[
java_home_len
-
3
],
"jre"
,
3
)
==
0
)
{
strncpy
(
tmp_path
,
p
,
java_home_len
-
3
);
tmp_path
[
java_home_len
-
3
]
=
'\0'
;
strncat
(
tmp_path
,
"bin"
,
3
);
// if the directory exists
DWORD
dwAttrib
=
GetFileAttributes
(
tmp_path
);
if
(
dwAttrib
!=
INVALID_FILE_ATTRIBUTES
&&
(
dwAttrib
&
FILE_ATTRIBUTE_DIRECTORY
))
{
// tmp_path should have the same length as java_home_len, since we only
// replaced 'jre' with 'bin'
if
(
len
>
(
int
)
java_home_len
+
1
)
{
strncat
(
paths
,
os
::
path_separator
(),
1
);
strncat
(
paths
,
tmp_path
,
java_home_len
);
}
}
}
_pfn_SymSetSearchPath
(
hProcess
,
paths
);
}
// find out if jvm.dll contains private symbols, by decoding
// current function and comparing the result
address
addr
=
(
address
)
Decoder
::
demangle
;
...
...
src/os/windows/vm/decoder_windows.hpp
浏览文件 @
06939246
...
...
@@ -35,6 +35,8 @@ typedef DWORD (WINAPI *pfn_SymSetOptions)(DWORD);
typedef
BOOL
(
WINAPI
*
pfn_SymInitialize
)(
HANDLE
,
PCTSTR
,
BOOL
);
typedef
BOOL
(
WINAPI
*
pfn_SymGetSymFromAddr64
)(
HANDLE
,
DWORD64
,
PDWORD64
,
PIMAGEHLP_SYMBOL64
);
typedef
DWORD
(
WINAPI
*
pfn_UndecorateSymbolName
)(
const
char
*
,
char
*
,
DWORD
,
DWORD
);
typedef
BOOL
(
WINAPI
*
pfn_SymSetSearchPath
)(
HANDLE
,
PCTSTR
);
typedef
BOOL
(
WINAPI
*
pfn_SymGetSearchPath
)(
HANDLE
,
PTSTR
,
int
);
class
WindowsDecoder
:
public
AbstractDecoder
{
...
...
src/os_cpu/bsd_x86/vm/vmStructs_bsd_x86.hpp
浏览文件 @
06939246
...
...
@@ -29,37 +29,26 @@
// constants required by the Serviceability Agent. This file is
// referenced by vmStructs.cpp.
#define VM_STRUCTS_OS_CPU(nonstatic_field, static_field, unchecked_nonstatic_field, volatile_nonstatic_field, nonproduct_nonstatic_field, c2_nonstatic_field, unchecked_c1_static_field, unchecked_c2_static_field
, last_entry
) \
#define VM_STRUCTS_OS_CPU(nonstatic_field, static_field, unchecked_nonstatic_field, volatile_nonstatic_field, nonproduct_nonstatic_field, c2_nonstatic_field, unchecked_c1_static_field, unchecked_c2_static_field) \
\
/******************************/
\
/* Threads (NOTE: incomplete) */
\
/******************************/
\
nonstatic_field(OSThread, _thread_id, OSThread::thread_id_t) \
nonstatic_field(OSThread, _pthread_id, pthread_t) \
/* This must be the last entry, and must be present */
\
last_entry()
nonstatic_field(OSThread, _pthread_id, pthread_t)
#define VM_TYPES_OS_CPU(declare_type, declare_toplevel_type, declare_oop_type, declare_integer_type, declare_unsigned_integer_type, declare_c1_toplevel_type, declare_c2_type, declare_c2_toplevel_type
, last_entry
) \
#define VM_TYPES_OS_CPU(declare_type, declare_toplevel_type, declare_oop_type, declare_integer_type, declare_unsigned_integer_type, declare_c1_toplevel_type, declare_c2_type, declare_c2_toplevel_type) \
\
/**********************/
\
/* Posix Thread IDs */
\
/**********************/
\
\
declare_unsigned_integer_type(OSThread::thread_id_t) \
declare_unsigned_integer_type(pthread_t) \
\
/* This must be the last entry, and must be present */
\
last_entry()
declare_unsigned_integer_type(pthread_t)
#define VM_INT_CONSTANTS_OS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant, last_entry) \
\
/* This must be the last entry, and must be present */
\
last_entry()
#define VM_INT_CONSTANTS_OS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant)
#define VM_LONG_CONSTANTS_OS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant, last_entry) \
\
/* This must be the last entry, and must be present */
\
last_entry()
#define VM_LONG_CONSTANTS_OS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant)
#endif // OS_CPU_BSD_X86_VM_VMSTRUCTS_BSD_X86_HPP
src/os_cpu/bsd_zero/vm/vmStructs_bsd_zero.hpp
浏览文件 @
06939246
...
...
@@ -30,21 +30,13 @@
// constants required by the Serviceability Agent. This file is
// referenced by vmStructs.cpp.
#define VM_STRUCTS_OS_CPU(nonstatic_field, static_field, unchecked_nonstatic_field, volatile_nonstatic_field, nonproduct_nonstatic_field, c2_nonstatic_field, unchecked_c1_static_field, unchecked_c2_static_field, last_entry) \
/* This must be the last entry, and must be present */
\
last_entry()
#define VM_STRUCTS_OS_CPU(nonstatic_field, static_field, unchecked_nonstatic_field, volatile_nonstatic_field, nonproduct_nonstatic_field, c2_nonstatic_field, unchecked_c1_static_field, unchecked_c2_static_field)
#define VM_TYPES_OS_CPU(declare_type, declare_toplevel_type, declare_oop_type, declare_integer_type, declare_unsigned_integer_type, declare_c1_toplevel_type, declare_c2_type, declare_c2_toplevel_type, last_entry) \
/* This must be the last entry, and must be present */
\
last_entry()
#define VM_TYPES_OS_CPU(declare_type, declare_toplevel_type, declare_oop_type, declare_integer_type, declare_unsigned_integer_type, declare_c1_toplevel_type, declare_c2_type, declare_c2_toplevel_type)
#define VM_INT_CONSTANTS_OS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant, last_entry) \
/* This must be the last entry, and must be present */
\
last_entry()
#define VM_INT_CONSTANTS_OS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant)
#define VM_LONG_CONSTANTS_OS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant, last_entry) \
/* This must be the last entry, and must be present */
\
last_entry()
#define VM_LONG_CONSTANTS_OS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant)
#endif // OS_CPU_BSD_ZERO_VM_VMSTRUCTS_BSD_ZERO_HPP
src/os_cpu/linux_sparc/vm/vmStructs_linux_sparc.hpp
浏览文件 @
06939246
...
...
@@ -29,7 +29,7 @@
// constants required by the Serviceability Agent. This file is
// referenced by vmStructs.cpp.
#define VM_STRUCTS_OS_CPU(nonstatic_field, static_field, unchecked_nonstatic_field, volatile_nonstatic_field, nonproduct_nonstatic_field, c2_nonstatic_field, unchecked_c1_static_field, unchecked_c2_static_field
, last_entry
) \
#define VM_STRUCTS_OS_CPU(nonstatic_field, static_field, unchecked_nonstatic_field, volatile_nonstatic_field, nonproduct_nonstatic_field, c2_nonstatic_field, unchecked_c1_static_field, unchecked_c2_static_field) \
\
/******************************/
\
/* Threads (NOTE: incomplete) */
\
...
...
@@ -37,38 +37,27 @@
\
nonstatic_field(JavaThread, _base_of_stack_pointer, intptr_t*) \
nonstatic_field(OSThread, _thread_id, OSThread::thread_id_t) \
nonstatic_field(OSThread, _pthread_id, pthread_t) \
/* This must be the last entry, and must be present */
\
last_entry()
nonstatic_field(OSThread, _pthread_id, pthread_t)
#define VM_TYPES_OS_CPU(declare_type, declare_toplevel_type, declare_oop_type, declare_integer_type, declare_unsigned_integer_type, declare_c1_toplevel_type, declare_c2_type, declare_c2_toplevel_type
, last_entry
) \
#define VM_TYPES_OS_CPU(declare_type, declare_toplevel_type, declare_oop_type, declare_integer_type, declare_unsigned_integer_type, declare_c1_toplevel_type, declare_c2_type, declare_c2_toplevel_type) \
\
/**********************/
\
/* POSIX Thread IDs */
\
/**********************/
\
\
declare_integer_type(OSThread::thread_id_t) \
declare_unsigned_integer_type(pthread_t) \
\
/* This must be the last entry, and must be present */
\
last_entry()
declare_unsigned_integer_type(pthread_t)
#define VM_INT_CONSTANTS_OS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant
, last_entry
) \
#define VM_INT_CONSTANTS_OS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant) \
\
/************************/
\
/* JavaThread constants */
\
/************************/
\
\
declare_constant(JavaFrameAnchor::flushed) \
\
/* This must be the last entry, and must be present */
\
last_entry()
declare_constant(JavaFrameAnchor::flushed)
#define VM_LONG_CONSTANTS_OS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant, last_entry) \
\
/* This must be the last entry, and must be present */
\
last_entry()
#define VM_LONG_CONSTANTS_OS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant)
#endif // OS_CPU_LINUX_SPARC_VM_VMSTRUCTS_LINUX_SPARC_HPP
src/os_cpu/linux_x86/vm/vmStructs_linux_x86.hpp
浏览文件 @
06939246
...
...
@@ -29,37 +29,26 @@
// constants required by the Serviceability Agent. This file is
// referenced by vmStructs.cpp.
#define VM_STRUCTS_OS_CPU(nonstatic_field, static_field, unchecked_nonstatic_field, volatile_nonstatic_field, nonproduct_nonstatic_field, c2_nonstatic_field, unchecked_c1_static_field, unchecked_c2_static_field
, last_entry
) \
#define VM_STRUCTS_OS_CPU(nonstatic_field, static_field, unchecked_nonstatic_field, volatile_nonstatic_field, nonproduct_nonstatic_field, c2_nonstatic_field, unchecked_c1_static_field, unchecked_c2_static_field) \
\
/******************************/
\
/* Threads (NOTE: incomplete) */
\
/******************************/
\
nonstatic_field(OSThread, _thread_id, OSThread::thread_id_t) \
nonstatic_field(OSThread, _pthread_id, pthread_t) \
/* This must be the last entry, and must be present */
\
last_entry()
nonstatic_field(OSThread, _pthread_id, pthread_t)
#define VM_TYPES_OS_CPU(declare_type, declare_toplevel_type, declare_oop_type, declare_integer_type, declare_unsigned_integer_type, declare_c1_toplevel_type, declare_c2_type, declare_c2_toplevel_type
, last_entry
) \
#define VM_TYPES_OS_CPU(declare_type, declare_toplevel_type, declare_oop_type, declare_integer_type, declare_unsigned_integer_type, declare_c1_toplevel_type, declare_c2_type, declare_c2_toplevel_type) \
\
/**********************/
\
/* Posix Thread IDs */
\
/**********************/
\
\
declare_integer_type(OSThread::thread_id_t) \
declare_unsigned_integer_type(pthread_t) \
\
/* This must be the last entry, and must be present */
\
last_entry()
declare_unsigned_integer_type(pthread_t)
#define VM_INT_CONSTANTS_OS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant, last_entry) \
\
/* This must be the last entry, and must be present */
\
last_entry()
#define VM_INT_CONSTANTS_OS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant)
#define VM_LONG_CONSTANTS_OS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant, last_entry) \
\
/* This must be the last entry, and must be present */
\
last_entry()
#define VM_LONG_CONSTANTS_OS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant)
#endif // OS_CPU_LINUX_X86_VM_VMSTRUCTS_LINUX_X86_HPP
src/os_cpu/linux_zero/vm/vmStructs_linux_zero.hpp
浏览文件 @
06939246
...
...
@@ -30,21 +30,12 @@
// constants required by the Serviceability Agent. This file is
// referenced by vmStructs.cpp.
#define VM_STRUCTS_OS_CPU(nonstatic_field, static_field, unchecked_nonstatic_field, volatile_nonstatic_field, nonproduct_nonstatic_field, c2_nonstatic_field, unchecked_c1_static_field, unchecked_c2_static_field, last_entry) \
/* This must be the last entry, and must be present */
\
last_entry()
#define VM_STRUCTS_OS_CPU(nonstatic_field, static_field, unchecked_nonstatic_field, volatile_nonstatic_field, nonproduct_nonstatic_field, c2_nonstatic_field, unchecked_c1_static_field, unchecked_c2_static_field)
#define VM_TYPES_OS_CPU(declare_type, declare_toplevel_type, declare_oop_type, declare_integer_type, declare_unsigned_integer_type, declare_c1_toplevel_type, declare_c2_type, declare_c2_toplevel_type)
#define VM_TYPES_OS_CPU(declare_type, declare_toplevel_type, declare_oop_type, declare_integer_type, declare_unsigned_integer_type, declare_c1_toplevel_type, declare_c2_type, declare_c2_toplevel_type, last_entry) \
/* This must be the last entry, and must be present */
\
last_entry()
#define VM_INT_CONSTANTS_OS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant)
#define VM_INT_CONSTANTS_OS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant, last_entry) \
/* This must be the last entry, and must be present */
\
last_entry()
#define VM_LONG_CONSTANTS_OS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant, last_entry) \
/* This must be the last entry, and must be present */
\
last_entry()
#define VM_LONG_CONSTANTS_OS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant)
#endif // OS_CPU_LINUX_ZERO_VM_VMSTRUCTS_LINUX_ZERO_HPP
src/os_cpu/solaris_sparc/vm/vmStructs_solaris_sparc.hpp
浏览文件 @
06939246
...
...
@@ -29,44 +29,32 @@
// constants required by the Serviceability Agent. This file is
// referenced by vmStructs.cpp.
#define VM_STRUCTS_OS_CPU(nonstatic_field, static_field, unchecked_nonstatic_field, volatile_nonstatic_field, nonproduct_nonstatic_field, c2_nonstatic_field, unchecked_c1_static_field, unchecked_c2_static_field
, last_entry
) \
#define VM_STRUCTS_OS_CPU(nonstatic_field, static_field, unchecked_nonstatic_field, volatile_nonstatic_field, nonproduct_nonstatic_field, c2_nonstatic_field, unchecked_c1_static_field, unchecked_c2_static_field) \
\
/******************************/
\
/* Threads (NOTE: incomplete) */
\
/******************************/
\
\
nonstatic_field(JavaThread, _base_of_stack_pointer, intptr_t*) \
nonstatic_field(OSThread, _thread_id, OSThread::thread_id_t) \
/* This must be the last entry, and must be present */
\
last_entry()
nonstatic_field(OSThread, _thread_id, OSThread::thread_id_t)
#define VM_TYPES_OS_CPU(declare_type, declare_toplevel_type, declare_oop_type, declare_integer_type, declare_unsigned_integer_type, declare_c1_toplevel_type, declare_c2_type, declare_c2_toplevel_type, last_entry) \
#define VM_TYPES_OS_CPU(declare_type, declare_toplevel_type, declare_oop_type, declare_integer_type, declare_unsigned_integer_type, declare_c1_toplevel_type, declare_c2_type, declare_c2_toplevel_type) \
\
/**********************/
\
/* Solaris Thread IDs */
\
/**********************/
\
\
declare_unsigned_integer_type(OSThread::thread_id_t) \
\
/* This must be the last entry, and must be present */
\
last_entry()
declare_unsigned_integer_type(OSThread::thread_id_t)
#define VM_INT_CONSTANTS_OS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant
, last_entry
) \
#define VM_INT_CONSTANTS_OS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant) \
\
/************************/
\
/* JavaThread constants */
\
/************************/
\
\
declare_constant(JavaFrameAnchor::flushed) \
\
/* This must be the last entry, and must be present */
\
last_entry()
declare_constant(JavaFrameAnchor::flushed)
#define VM_LONG_CONSTANTS_OS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant, last_entry) \
\
/* This must be the last entry, and must be present */
\
last_entry()
#define VM_LONG_CONSTANTS_OS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant)
#endif // OS_CPU_SOLARIS_SPARC_VM_VMSTRUCTS_SOLARIS_SPARC_HPP
src/os_cpu/solaris_x86/vm/vmStructs_solaris_x86.hpp
浏览文件 @
06939246
...
...
@@ -29,36 +29,24 @@
// constants required by the Serviceability Agent. This file is
// referenced by vmStructs.cpp.
#define VM_STRUCTS_OS_CPU(nonstatic_field, static_field, unchecked_nonstatic_field, volatile_nonstatic_field, nonproduct_nonstatic_field, c2_nonstatic_field, unchecked_c1_static_field, unchecked_c2_static_field
, last_entry
) \
#define VM_STRUCTS_OS_CPU(nonstatic_field, static_field, unchecked_nonstatic_field, volatile_nonstatic_field, nonproduct_nonstatic_field, c2_nonstatic_field, unchecked_c1_static_field, unchecked_c2_static_field) \
\
/******************************/
\
/* Threads (NOTE: incomplete) */
\
/******************************/
\
\
nonstatic_field(OSThread, _thread_id, OSThread::thread_id_t) \
\
/* This must be the last entry, and must be present */
\
last_entry()
nonstatic_field(OSThread, _thread_id, OSThread::thread_id_t)
#define VM_TYPES_OS_CPU(declare_type, declare_toplevel_type, declare_oop_type, declare_integer_type, declare_unsigned_integer_type, declare_c1_toplevel_type, declare_c2_type, declare_c2_toplevel_type
, last_entry
) \
#define VM_TYPES_OS_CPU(declare_type, declare_toplevel_type, declare_oop_type, declare_integer_type, declare_unsigned_integer_type, declare_c1_toplevel_type, declare_c2_type, declare_c2_toplevel_type) \
\
/**********************/
\
/* Solaris Thread IDs */
\
/**********************/
\
\
declare_unsigned_integer_type(OSThread::thread_id_t) \
\
/* This must be the last entry, and must be present */
\
last_entry()
declare_unsigned_integer_type(OSThread::thread_id_t)
#define VM_INT_CONSTANTS_OS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant, last_entry) \
\
/* This must be the last entry, and must be present */
\
last_entry()
#define VM_INT_CONSTANTS_OS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant)
#define VM_LONG_CONSTANTS_OS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant, last_entry) \
\
/* This must be the last entry, and must be present */
\
last_entry()
#define VM_LONG_CONSTANTS_OS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant)
#endif // OS_CPU_SOLARIS_X86_VM_VMSTRUCTS_SOLARIS_X86_HPP
src/os_cpu/windows_x86/vm/vmStructs_windows_x86.hpp
浏览文件 @
06939246
...
...
@@ -29,32 +29,21 @@
// constants required by the Serviceability Agent. This file is
// referenced by vmStructs.cpp.
#define VM_STRUCTS_OS_CPU(nonstatic_field, static_field, unchecked_nonstatic_field, volatile_nonstatic_field, nonproduct_nonstatic_field, c2_nonstatic_field, unchecked_c1_static_field, unchecked_c2_static_field
, last_entry
) \
#define VM_STRUCTS_OS_CPU(nonstatic_field, static_field, unchecked_nonstatic_field, volatile_nonstatic_field, nonproduct_nonstatic_field, c2_nonstatic_field, unchecked_c1_static_field, unchecked_c2_static_field) \
\
/******************************/
\
/* Threads (NOTE: incomplete) */
\
/******************************/
\
\
nonstatic_field(OSThread, _thread_id, OSThread::thread_id_t) \
unchecked_nonstatic_field(OSThread, _thread_handle, sizeof(HANDLE))
/* NOTE: no type */
\
\
/* This must be the last entry, and must be present */
\
last_entry()
unchecked_nonstatic_field(OSThread, _thread_handle, sizeof(HANDLE))
/* NOTE: no type */
#define VM_TYPES_OS_CPU(declare_type, declare_toplevel_type, declare_oop_type, declare_integer_type, declare_unsigned_integer_type, declare_c1_toplevel_type, declare_c2_type, declare_c2_toplevel_type
, last_entry
) \
#define VM_TYPES_OS_CPU(declare_type, declare_toplevel_type, declare_oop_type, declare_integer_type, declare_unsigned_integer_type, declare_c1_toplevel_type, declare_c2_type, declare_c2_toplevel_type) \
\
declare_unsigned_integer_type(OSThread::thread_id_t) \
/* This must be the last entry, and must be present */
\
last_entry()
declare_unsigned_integer_type(OSThread::thread_id_t)
#define VM_INT_CONSTANTS_OS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant, last_entry) \
\
/* This must be the last entry, and must be present */
\
last_entry()
#define VM_INT_CONSTANTS_OS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant)
#define VM_LONG_CONSTANTS_OS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant, last_entry) \
\
/* This must be the last entry, and must be present */
\
last_entry()
#define VM_LONG_CONSTANTS_OS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant)
#endif // OS_CPU_WINDOWS_X86_VM_VMSTRUCTS_WINDOWS_X86_HPP
src/share/vm/classfile/classFileParser.cpp
浏览文件 @
06939246
/*
* Copyright (c) 1997, 201
2
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 201
3
, 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
...
...
@@ -3912,7 +3912,10 @@ instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name,
// check that if this class is an interface then it doesn't have static methods
if
(
this_klass
->
is_interface
())
{
check_illegal_static_method
(
this_klass
,
CHECK_
(
nullHandle
));
/* An interface in a JAVA 8 classfile can be static */
if
(
_major_version
<
JAVA_8_VERSION
)
{
check_illegal_static_method
(
this_klass
,
CHECK_
(
nullHandle
));
}
}
...
...
@@ -4466,6 +4469,7 @@ void ClassFileParser::verify_legal_method_modifiers(
const
bool
is_bridge
=
(
flags
&
JVM_ACC_BRIDGE
)
!=
0
;
const
bool
is_strict
=
(
flags
&
JVM_ACC_STRICT
)
!=
0
;
const
bool
is_synchronized
=
(
flags
&
JVM_ACC_SYNCHRONIZED
)
!=
0
;
const
bool
is_protected
=
(
flags
&
JVM_ACC_PROTECTED
)
!=
0
;
const
bool
major_gte_15
=
_major_version
>=
JAVA_1_5_VERSION
;
const
bool
major_gte_8
=
_major_version
>=
JAVA_8_VERSION
;
const
bool
is_initializer
=
(
name
==
vmSymbols
::
object_initializer_name
());
...
...
@@ -4473,11 +4477,33 @@ void ClassFileParser::verify_legal_method_modifiers(
bool
is_illegal
=
false
;
if
(
is_interface
)
{
if
(
!
is_public
||
is_static
||
is_final
||
is_native
||
((
is_synchronized
||
is_strict
)
&&
major_gte_15
&&
(
!
major_gte_8
||
is_abstract
))
||
(
!
major_gte_8
&&
!
is_abstract
))
{
is_illegal
=
true
;
if
(
major_gte_8
)
{
// Class file version is JAVA_8_VERSION or later Methods of
// interfaces may set any of the flags except ACC_PROTECTED,
// ACC_FINAL, ACC_NATIVE, and ACC_SYNCHRONIZED; they must
// have exactly one of the ACC_PUBLIC or ACC_PRIVATE flags set.
if
((
is_public
==
is_private
)
||
/* Only one of private and public should be true - XNOR */
(
is_native
||
is_protected
||
is_final
||
is_synchronized
)
||
// If a specific method of a class or interface has its
// ACC_ABSTRACT flag set, it must not have any of its
// ACC_FINAL, ACC_NATIVE, ACC_PRIVATE, ACC_STATIC,
// ACC_STRICT, or ACC_SYNCHRONIZED flags set. No need to
// check for ACC_FINAL, ACC_NATIVE or ACC_SYNCHRONIZED as
// those flags are illegal irrespective of ACC_ABSTRACT being set or not.
(
is_abstract
&&
(
is_private
||
is_static
||
is_strict
)))
{
is_illegal
=
true
;
}
}
else
if
(
major_gte_15
)
{
// Class file version in the interval [JAVA_1_5_VERSION, JAVA_8_VERSION)
if
(
!
is_public
||
is_static
||
is_final
||
is_synchronized
||
is_native
||
!
is_abstract
||
is_strict
)
{
is_illegal
=
true
;
}
}
else
{
// Class file version is pre-JAVA_1_5_VERSION
if
(
!
is_public
||
is_static
||
is_final
||
is_native
||
!
is_abstract
)
{
is_illegal
=
true
;
}
}
}
else
{
// not interface
if
(
is_initializer
)
{
...
...
src/share/vm/classfile/placeholders.cpp
浏览文件 @
06939246
/*
* Copyright (c) 2003, 201
2
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2003, 201
3
, 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
...
...
@@ -142,7 +142,7 @@ PlaceholderEntry* PlaceholderTable::find_and_add(int index, unsigned int hash,
}
// placeholder used to track class loading internal states
// placeholder
is
used to track class loading internal states
// placeholder existence now for loading superclass/superinterface
// superthreadQ tracks class circularity, while loading superclass/superinterface
// loadInstanceThreadQ tracks load_instance_class calls
...
...
@@ -153,15 +153,17 @@ PlaceholderEntry* PlaceholderTable::find_and_add(int index, unsigned int hash,
// All claimants remove SeenThread after completing action
// On removal: if definer and all queues empty, remove entry
// Note: you can be in both placeholders and systemDictionary
// see parse_stream for redefine classes
// Therefore - must always check SD first
// Ignores the case where entry is not found
void
PlaceholderTable
::
find_and_remove
(
int
index
,
unsigned
int
hash
,
Symbol
*
name
,
ClassLoaderData
*
loader_data
,
Thread
*
thread
)
{
Symbol
*
name
,
ClassLoaderData
*
loader_data
,
classloadAction
action
,
Thread
*
thread
)
{
assert_locked_or_safepoint
(
SystemDictionary_lock
);
PlaceholderEntry
*
probe
=
get_entry
(
index
,
hash
,
name
,
loader_data
);
if
(
probe
!=
NULL
)
{
// No other threads using this entry
probe
->
remove_seen_thread
(
thread
,
action
);
// If no other threads using this entry, and this thread is not using this entry for other states
if
((
probe
->
superThreadQ
()
==
NULL
)
&&
(
probe
->
loadInstanceThreadQ
()
==
NULL
)
&&
(
probe
->
defineThreadQ
()
==
NULL
)
&&
(
probe
->
definer
()
==
NULL
))
{
remove_entry
(
index
,
hash
,
name
,
loader_data
);
...
...
src/share/vm/classfile/placeholders.hpp
浏览文件 @
06939246
/*
* Copyright (c) 2003, 201
2
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2003, 201
3
, 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
...
...
@@ -82,7 +82,7 @@ public:
};
// find_and_add returns probe pointer - old or new
// If no entry exists, add a placeholder entry and push SeenThread
// If no entry exists, add a placeholder entry and push SeenThread
for classloadAction
// If entry exists, reuse entry and push SeenThread for classloadAction
PlaceholderEntry
*
find_and_add
(
int
index
,
unsigned
int
hash
,
Symbol
*
name
,
ClassLoaderData
*
loader_data
,
...
...
@@ -92,9 +92,11 @@ public:
void
remove_entry
(
int
index
,
unsigned
int
hash
,
Symbol
*
name
,
ClassLoaderData
*
loader_data
);
// Remove placeholder information
// find_and_remove first removes SeenThread for classloadAction
// If all queues are empty and definer is null, remove the PlacheholderEntry completely
void
find_and_remove
(
int
index
,
unsigned
int
hash
,
Symbol
*
name
,
ClassLoaderData
*
loader_data
,
Thread
*
thread
);
Symbol
*
name
,
ClassLoaderData
*
loader_data
,
classloadAction
action
,
Thread
*
thread
);
// GC support.
void
classes_do
(
KlassClosure
*
f
);
...
...
src/share/vm/classfile/systemDictionary.cpp
浏览文件 @
06939246
/*
* Copyright (c) 1997, 201
2
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 201
3
, 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
...
...
@@ -172,7 +172,7 @@ Klass* SystemDictionary::handle_resolution_exception(Symbol* class_name, Handle
assert
(
klass_h
()
==
NULL
,
"Should not have result with exception pending"
);
Handle
e
(
THREAD
,
PENDING_EXCEPTION
);
CLEAR_PENDING_EXCEPTION
;
THROW_MSG_CAUSE_
0
(
vmSymbols
::
java_lang_NoClassDefFoundError
(),
class_name
->
as_C_string
(),
e
);
THROW_MSG_CAUSE_
NULL
(
vmSymbols
::
java_lang_NoClassDefFoundError
(),
class_name
->
as_C_string
(),
e
);
}
else
{
return
NULL
;
}
...
...
@@ -181,9 +181,9 @@ Klass* SystemDictionary::handle_resolution_exception(Symbol* class_name, Handle
if
(
klass_h
()
==
NULL
)
{
ResourceMark
rm
(
THREAD
);
if
(
throw_error
)
{
THROW_MSG_
0
(
vmSymbols
::
java_lang_NoClassDefFoundError
(),
class_name
->
as_C_string
());
THROW_MSG_
NULL
(
vmSymbols
::
java_lang_NoClassDefFoundError
(),
class_name
->
as_C_string
());
}
else
{
THROW_MSG_
0
(
vmSymbols
::
java_lang_ClassNotFoundException
(),
class_name
->
as_C_string
());
THROW_MSG_
NULL
(
vmSymbols
::
java_lang_ClassNotFoundException
(),
class_name
->
as_C_string
());
}
}
return
(
Klass
*
)
klass_h
();
...
...
@@ -343,29 +343,29 @@ Klass* SystemDictionary::resolve_super_or_fail(Symbol* child_name,
}
if
(
throw_circularity_error
)
{
ResourceMark
rm
(
THREAD
);
THROW_MSG_
0
(
vmSymbols
::
java_lang_ClassCircularityError
(),
child_name
->
as_C_string
());
THROW_MSG_
NULL
(
vmSymbols
::
java_lang_ClassCircularityError
(),
child_name
->
as_C_string
());
}
// java.lang.Object should have been found above
assert
(
class_name
!=
NULL
,
"null super class for resolving"
);
// Resolve the super class or interface, check results on return
Klass
*
superk
=
NULL
;
superk
=
SystemDictionary
::
resolve_or_null
(
class_name
,
Klass
*
superk
=
SystemDictionary
::
resolve_or_null
(
class_name
,
class_loader
,
protection_domain
,
THREAD
);
KlassHandle
superk_h
(
THREAD
,
superk
);
// Note: clean up of placeholders currently in callers of
// resolve_super_or_fail - either at update_dictionary time
// or on error
// Clean up of placeholders moved so that each classloadAction registrar self-cleans up
// It is no longer necessary to keep the placeholder table alive until update_dictionary
// or error. GC used to walk the placeholder table as strong roots.
// The instanceKlass is kept alive because the class loader is on the stack,
// which keeps the loader_data alive, as well as all instanceKlasses in
// the loader_data. parseClassFile adds the instanceKlass to loader_data.
{
MutexLocker
mu
(
SystemDictionary_lock
,
THREAD
);
PlaceholderEntry
*
probe
=
placeholders
()
->
get_entry
(
p_index
,
p_hash
,
child_name
,
loader_data
);
if
(
probe
!=
NULL
)
{
probe
->
remove_seen_thread
(
THREAD
,
PlaceholderTable
::
LOAD_SUPER
);
}
MutexLocker
mu
(
SystemDictionary_lock
,
THREAD
);
placeholders
()
->
find_and_remove
(
p_index
,
p_hash
,
child_name
,
loader_data
,
PlaceholderTable
::
LOAD_SUPER
,
THREAD
);
SystemDictionary_lock
->
notify_all
();
}
if
(
HAS_PENDING_EXCEPTION
||
superk_h
()
==
NULL
)
{
// can null superk
...
...
@@ -430,8 +430,8 @@ void SystemDictionary::validate_protection_domain(instanceKlassHandle klass,
// We're using a No_Safepoint_Verifier to catch any place where we
// might potentially do a GC at all.
//
SystemDictionary::do_unloading() asserts that classes
are only
// unloaded at a safepoint.
//
Dictionary::do_unloading() asserts that classes in SD
are only
// unloaded at a safepoint.
Anonymous classes are not in SD.
No_Safepoint_Verifier
nosafepoint
;
dictionary
()
->
add_protection_domain
(
d_index
,
d_hash
,
klass
,
loader_data
,
protection_domain
,
THREAD
);
...
...
@@ -486,7 +486,6 @@ void SystemDictionary::double_lock_wait(Handle lockObject, TRAPS) {
// super class loading here.
// This also is critical in cases where the original thread gets stalled
// even in non-circularity situations.
// Note: only one thread can define the class, but multiple can resolve
// Note: must call resolve_super_or_fail even if null super -
// to force placeholder entry creation for this class for circularity detection
// Caller must check for pending exception
...
...
@@ -518,14 +517,6 @@ instanceKlassHandle SystemDictionary::handle_parallel_super_load(
protection_domain
,
true
,
CHECK_
(
nh
));
// We don't redefine the class, so we just need to clean up if there
// was not an error (don't want to modify any system dictionary
// data structures).
{
MutexLocker
mu
(
SystemDictionary_lock
,
THREAD
);
placeholders
()
->
find_and_remove
(
p_index
,
p_hash
,
name
,
loader_data
,
THREAD
);
SystemDictionary_lock
->
notify_all
();
}
// parallelCapable class loaders do NOT wait for parallel superclass loads to complete
// Serial class loaders and bootstrap classloader do wait for superclass loads
...
...
@@ -595,6 +586,10 @@ Klass* SystemDictionary::resolve_instance_class_or_null(Symbol* name, Handle cla
// Do lookup to see if class already exist and the protection domain
// has the right access
// This call uses find which checks protection domain already matches
// All subsequent calls use find_class, and set has_loaded_class so that
// before we return a result we call out to java to check for valid protection domain
// to allow returning the Klass* and add it to the pd_set if it is valid
unsigned
int
d_hash
=
dictionary
()
->
compute_hash
(
name
,
loader_data
);
int
d_index
=
dictionary
()
->
hash_to_index
(
d_hash
);
Klass
*
probe
=
dictionary
()
->
find
(
d_index
,
d_hash
,
name
,
loader_data
,
...
...
@@ -652,7 +647,7 @@ Klass* SystemDictionary::resolve_instance_class_or_null(Symbol* name, Handle cla
}
}
// If the class i
n i
s in the placeholder table, class loading is in progress
// If the class is in the placeholder table, class loading is in progress
if
(
super_load_in_progress
&&
havesupername
==
true
)
{
k
=
SystemDictionary
::
handle_parallel_super_load
(
name
,
superclassname
,
class_loader
,
protection_domain
,
lockObject
,
THREAD
);
...
...
@@ -664,7 +659,9 @@ Klass* SystemDictionary::resolve_instance_class_or_null(Symbol* name, Handle cla
}
}
bool
throw_circularity_error
=
false
;
if
(
!
class_has_been_loaded
)
{
bool
load_instance_added
=
false
;
// add placeholder entry to record loading instance class
// Five cases:
...
...
@@ -690,7 +687,7 @@ Klass* SystemDictionary::resolve_instance_class_or_null(Symbol* name, Handle cla
// No performance benefit and no deadlock issues.
// case 5. parallelCapable user level classloaders - without objectLocker
// Allow parallel classloading of a class/classloader pair
bool
throw_circularity_error
=
false
;
{
MutexLocker
mu
(
SystemDictionary_lock
,
THREAD
);
if
(
class_loader
.
is_null
()
||
!
is_parallelCapable
(
class_loader
))
{
...
...
@@ -726,12 +723,13 @@ Klass* SystemDictionary::resolve_instance_class_or_null(Symbol* name, Handle cla
}
}
}
// All cases: add LOAD_INSTANCE
// All cases: add LOAD_INSTANCE
holding SystemDictionary_lock
// case 3: UnsyncloadClass || case 5: parallelCapable: allow competing threads to try
// LOAD_INSTANCE in parallel
// add placeholder entry even if error - callers will remove on error
if
(
!
throw_circularity_error
&&
!
class_has_been_loaded
)
{
PlaceholderEntry
*
newprobe
=
placeholders
()
->
find_and_add
(
p_index
,
p_hash
,
name
,
loader_data
,
PlaceholderTable
::
LOAD_INSTANCE
,
NULL
,
THREAD
);
load_instance_added
=
true
;
// For class loaders that do not acquire the classloader object lock,
// if they did not catch another thread holding LOAD_INSTANCE,
// need a check analogous to the acquire ObjectLocker/find_class
...
...
@@ -740,19 +738,18 @@ Klass* SystemDictionary::resolve_instance_class_or_null(Symbol* name, Handle cla
// class loaders holding the ObjectLock shouldn't find the class here
Klass
*
check
=
find_class
(
d_index
,
d_hash
,
name
,
loader_data
);
if
(
check
!=
NULL
)
{
// Klass is already loaded, so
just return it
// Klass is already loaded, so
return it after checking/adding protection domain
k
=
instanceKlassHandle
(
THREAD
,
check
);
class_has_been_loaded
=
true
;
newprobe
->
remove_seen_thread
(
THREAD
,
PlaceholderTable
::
LOAD_INSTANCE
);
placeholders
()
->
find_and_remove
(
p_index
,
p_hash
,
name
,
loader_data
,
THREAD
);
SystemDictionary_lock
->
notify_all
();
}
}
}
// must throw error outside of owning lock
if
(
throw_circularity_error
)
{
assert
(
!
HAS_PENDING_EXCEPTION
&&
load_instance_added
==
false
,
"circularity error cleanup"
);
ResourceMark
rm
(
THREAD
);
THROW_MSG_
0
(
vmSymbols
::
java_lang_ClassCircularityError
(),
name
->
as_C_string
());
THROW_MSG_
NULL
(
vmSymbols
::
java_lang_ClassCircularityError
(),
name
->
as_C_string
());
}
if
(
!
class_has_been_loaded
)
{
...
...
@@ -782,20 +779,6 @@ Klass* SystemDictionary::resolve_instance_class_or_null(Symbol* name, Handle cla
}
}
// clean up placeholder entries for success or error
// This cleans up LOAD_INSTANCE entries
// It also cleans up LOAD_SUPER entries on errors from
// calling load_instance_class
{
MutexLocker
mu
(
SystemDictionary_lock
,
THREAD
);
PlaceholderEntry
*
probe
=
placeholders
()
->
get_entry
(
p_index
,
p_hash
,
name
,
loader_data
);
if
(
probe
!=
NULL
)
{
probe
->
remove_seen_thread
(
THREAD
,
PlaceholderTable
::
LOAD_INSTANCE
);
placeholders
()
->
find_and_remove
(
p_index
,
p_hash
,
name
,
loader_data
,
THREAD
);
SystemDictionary_lock
->
notify_all
();
}
}
// If everything was OK (no exceptions, no null return value), and
// class_loader is NOT the defining loader, do a little more bookkeeping.
if
(
!
HAS_PENDING_EXCEPTION
&&
!
k
.
is_null
()
&&
...
...
@@ -819,18 +802,22 @@ Klass* SystemDictionary::resolve_instance_class_or_null(Symbol* name, Handle cla
}
}
}
if
(
HAS_PENDING_EXCEPTION
||
k
.
is_null
())
{
// On error, clean up placeholders
{
MutexLocker
mu
(
SystemDictionary_lock
,
THREAD
);
placeholders
()
->
find_and_remove
(
p_index
,
p_hash
,
name
,
loader_data
,
THREAD
);
SystemDictionary_lock
->
notify_all
();
}
return
NULL
;
}
}
// load_instance_class loop
if
(
load_instance_added
==
true
)
{
// clean up placeholder entries for LOAD_INSTANCE success or error
// This brackets the SystemDictionary updates for both defining
// and initiating loaders
MutexLocker
mu
(
SystemDictionary_lock
,
THREAD
);
placeholders
()
->
find_and_remove
(
p_index
,
p_hash
,
name
,
loader_data
,
PlaceholderTable
::
LOAD_INSTANCE
,
THREAD
)
;
SystemDictionary_lock
->
notify_all
();
}
}
if
(
HAS_PENDING_EXCEPTION
||
k
.
is_null
())
{
return
NULL
;
}
#ifdef ASSERT
{
ClassLoaderData
*
loader_data
=
k
->
class_loader_data
();
...
...
@@ -850,8 +837,8 @@ Klass* SystemDictionary::resolve_instance_class_or_null(Symbol* name, Handle cla
// so we cannot allow GC to occur while we're holding this entry.
// We're using a No_Safepoint_Verifier to catch any place where we
// might potentially do a GC at all.
//
SystemDictionary::do_unloading() asserts that classes
are only
// unloaded at a safepoint.
//
Dictionary::do_unloading() asserts that classes in SD
are only
// unloaded at a safepoint.
Anonymous classes are not in SD.
No_Safepoint_Verifier
nosafepoint
;
if
(
dictionary
()
->
is_valid_protection_domain
(
d_index
,
d_hash
,
name
,
loader_data
,
...
...
@@ -898,8 +885,8 @@ Klass* SystemDictionary::find(Symbol* class_name,
// so we cannot allow GC to occur while we're holding this entry.
// We're using a No_Safepoint_Verifier to catch any place where we
// might potentially do a GC at all.
//
SystemDictionary::do_unloading() asserts that classes
are only
// unloaded at a safepoint.
//
Dictionary::do_unloading() asserts that classes in SD
are only
// unloaded at a safepoint.
Anonymous classes are not in SD.
No_Safepoint_Verifier
nosafepoint
;
return
dictionary
()
->
find
(
d_index
,
d_hash
,
class_name
,
loader_data
,
protection_domain
,
THREAD
);
...
...
@@ -965,10 +952,6 @@ Klass* SystemDictionary::parse_stream(Symbol* class_name,
// throw potential ClassFormatErrors.
//
// Note: "name" is updated.
// Further note: a placeholder will be added for this class when
// super classes are loaded (resolve_super_or_fail). We expect this
// to be called for all classes but java.lang.Object; and we preload
// java.lang.Object through resolve_or_fail, not this path.
instanceKlassHandle
k
=
ClassFileParser
(
st
).
parseClassFile
(
class_name
,
loader_data
,
...
...
@@ -979,21 +962,6 @@ Klass* SystemDictionary::parse_stream(Symbol* class_name,
true
,
THREAD
);
// We don't redefine the class, so we just need to clean up whether there
// was an error or not (don't want to modify any system dictionary
// data structures).
// Parsed name could be null if we threw an error before we got far
// enough along to parse it -- in that case, there is nothing to clean up.
if
(
parsed_name
!=
NULL
)
{
unsigned
int
p_hash
=
placeholders
()
->
compute_hash
(
parsed_name
,
loader_data
);
int
p_index
=
placeholders
()
->
hash_to_index
(
p_hash
);
{
MutexLocker
mu
(
SystemDictionary_lock
,
THREAD
);
placeholders
()
->
find_and_remove
(
p_index
,
p_hash
,
parsed_name
,
loader_data
,
THREAD
);
SystemDictionary_lock
->
notify_all
();
}
}
if
(
host_klass
.
not_null
()
&&
k
.
not_null
())
{
assert
(
EnableInvokeDynamic
,
""
);
...
...
@@ -1062,10 +1030,6 @@ Klass* SystemDictionary::resolve_from_stream(Symbol* class_name,
// throw potential ClassFormatErrors.
//
// Note: "name" is updated.
// Further note: a placeholder will be added for this class when
// super classes are loaded (resolve_super_or_fail). We expect this
// to be called for all classes but java.lang.Object; and we preload
// java.lang.Object through resolve_or_fail, not this path.
instanceKlassHandle
k
=
ClassFileParser
(
st
).
parseClassFile
(
class_name
,
loader_data
,
...
...
@@ -1114,25 +1078,7 @@ Klass* SystemDictionary::resolve_from_stream(Symbol* class_name,
}
}
// If parsing the class file or define_instance_class failed, we
// need to remove the placeholder added on our behalf. But we
// must make sure parsed_name is valid first (it won't be if we had
// a format error before the class was parsed far enough to
// find the name).
if
(
HAS_PENDING_EXCEPTION
&&
parsed_name
!=
NULL
)
{
unsigned
int
p_hash
=
placeholders
()
->
compute_hash
(
parsed_name
,
loader_data
);
int
p_index
=
placeholders
()
->
hash_to_index
(
p_hash
);
{
MutexLocker
mu
(
SystemDictionary_lock
,
THREAD
);
placeholders
()
->
find_and_remove
(
p_index
,
p_hash
,
parsed_name
,
loader_data
,
THREAD
);
SystemDictionary_lock
->
notify_all
();
}
return
NULL
;
}
// Make sure that we didn't leave a place holder in the
// SystemDictionary; this is only done on success
// Make sure we have an entry in the SystemDictionary on success
debug_only
(
{
if
(
!
HAS_PENDING_EXCEPTION
)
{
assert
(
parsed_name
!=
NULL
,
"parsed_name is still null?"
);
...
...
@@ -1547,8 +1493,7 @@ instanceKlassHandle SystemDictionary::find_or_define_instance_class(Symbol* clas
// Other cases fall through, and may run into duplicate defines
// caught by finding an entry in the SystemDictionary
if
((
UnsyncloadClass
||
is_parallelDefine
(
class_loader
))
&&
(
probe
->
instance_klass
()
!=
NULL
))
{
probe
->
remove_seen_thread
(
THREAD
,
PlaceholderTable
::
DEFINE_CLASS
);
placeholders
()
->
find_and_remove
(
p_index
,
p_hash
,
name_h
,
loader_data
,
THREAD
);
placeholders
()
->
find_and_remove
(
p_index
,
p_hash
,
name_h
,
loader_data
,
PlaceholderTable
::
DEFINE_CLASS
,
THREAD
);
SystemDictionary_lock
->
notify_all
();
#ifdef ASSERT
Klass
*
check
=
find_class
(
d_index
,
d_hash
,
name_h
,
loader_data
);
...
...
@@ -1578,8 +1523,7 @@ instanceKlassHandle SystemDictionary::find_or_define_instance_class(Symbol* clas
probe
->
set_instance_klass
(
k
());
}
probe
->
set_definer
(
NULL
);
probe
->
remove_seen_thread
(
THREAD
,
PlaceholderTable
::
DEFINE_CLASS
);
placeholders
()
->
find_and_remove
(
p_index
,
p_hash
,
name_h
,
loader_data
,
THREAD
);
placeholders
()
->
find_and_remove
(
p_index
,
p_hash
,
name_h
,
loader_data
,
PlaceholderTable
::
DEFINE_CLASS
,
THREAD
);
SystemDictionary_lock
->
notify_all
();
}
}
...
...
@@ -1736,6 +1680,8 @@ int SystemDictionary::calculate_systemdictionary_size(int classcount) {
}
return
newsize
;
}
// Assumes classes in the SystemDictionary are only unloaded at a safepoint
// Note: anonymous classes are not in the SD.
bool
SystemDictionary
::
do_unloading
(
BoolObjectClosure
*
is_alive
)
{
// First, mark for unload all ClassLoaderData referencing a dead class loader.
bool
has_dead_loaders
=
ClassLoaderDataGraph
::
do_unloading
(
is_alive
);
...
...
@@ -2105,9 +2051,7 @@ void SystemDictionary::update_dictionary(int d_index, unsigned int d_hash,
// All loaded classes get a unique ID.
TRACE_INIT_ID
(
k
);
// Check for a placeholder. If there, remove it and make a
// new system dictionary entry.
placeholders
()
->
find_and_remove
(
p_index
,
p_hash
,
name
,
loader_data
,
THREAD
);
// Make a new system dictionary entry.
Klass
*
sd_check
=
find_class
(
d_index
,
d_hash
,
name
,
loader_data
);
if
(
sd_check
==
NULL
)
{
dictionary
()
->
add_klass
(
name
,
loader_data
,
k
);
...
...
@@ -2116,12 +2060,8 @@ void SystemDictionary::update_dictionary(int d_index, unsigned int d_hash,
#ifdef ASSERT
sd_check
=
find_class
(
d_index
,
d_hash
,
name
,
loader_data
);
assert
(
sd_check
!=
NULL
,
"should have entry in system dictionary"
);
// Changed to allow PH to remain to complete class circularity checking
// while only one thread can define a class at one time, multiple
// classes can resolve the superclass for a class at one time,
// and the placeholder is used to track that
// Symbol* ph_check = find_placeholder(name, class_loader);
// assert (ph_check == NULL, "should not have a placeholder entry");
// Note: there may be a placeholder entry: for circularity testing
// or for parallel defines
#endif
SystemDictionary_lock
->
notify_all
();
}
...
...
src/share/vm/runtime/vmStructs.cpp
浏览文件 @
06939246
此差异已折叠。
点击以展开。
src/share/vm/utilities/exceptions.hpp
浏览文件 @
06939246
/*
* Copyright (c) 1998, 201
2
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1998, 201
3
, 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
...
...
@@ -267,6 +267,7 @@ class Exceptions {
#define THROW_WRAPPED_0(name, oop_to_wrap) THROW_WRAPPED_(name, oop_to_wrap, 0)
#define THROW_ARG_0(name, signature, arg) THROW_ARG_(name, signature, arg, 0)
#define THROW_MSG_CAUSE_0(name, message, cause) THROW_MSG_CAUSE_(name, message, cause, 0)
#define THROW_MSG_CAUSE_NULL(name, message, cause) THROW_MSG_CAUSE_(name, message, cause, NULL)
#define THROW_NULL(name) THROW_(name, NULL)
#define THROW_MSG_NULL(name, message) THROW_MSG_(name, message, NULL)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录