Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_hotspot
提交
76074c76
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看板
提交
76074c76
编写于
5月 17, 2013
作者:
S
shade
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
8012939: @Contended doesn't work correctly with inheritance
Summary: Fix instance_size miscalculation. Reviewed-by: jrose, kvn
上级
fc34a84b
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
252 addition
and
4 deletion
+252
-4
src/share/vm/classfile/classFileParser.cpp
src/share/vm/classfile/classFileParser.cpp
+4
-4
test/runtime/contended/Inheritance1.java
test/runtime/contended/Inheritance1.java
+248
-0
未找到文件。
src/share/vm/classfile/classFileParser.cpp
浏览文件 @
76074c76
...
...
@@ -3165,13 +3165,13 @@ void ClassFileParser::layout_fields(Handle class_loader,
first_nonstatic_field_offset
=
instanceOopDesc
::
base_offset_in_bytes
()
+
nonstatic_field_size
*
heapOopSize
;
next_nonstatic_field_offset
=
first_nonstatic_field_offset
;
// class is contended, pad before all the fields
if
(
parsed_annotations
->
is_contended
())
{
firs
t_nonstatic_field_offset
+=
pad_size
;
nex
t_nonstatic_field_offset
+=
pad_size
;
}
next_nonstatic_field_offset
=
first_nonstatic_field_offset
;
unsigned
int
nonstatic_double_count
=
fac
->
count
[
NONSTATIC_DOUBLE
]
-
fac_contended
.
count
[
NONSTATIC_DOUBLE
];
unsigned
int
nonstatic_word_count
=
fac
->
count
[
NONSTATIC_WORD
]
-
fac_contended
.
count
[
NONSTATIC_WORD
];
unsigned
int
nonstatic_short_count
=
fac
->
count
[
NONSTATIC_SHORT
]
-
fac_contended
.
count
[
NONSTATIC_SHORT
];
...
...
@@ -3562,7 +3562,7 @@ void ClassFileParser::layout_fields(Handle class_loader,
int
instance_size
=
align_object_size
(
next_nonstatic_type_offset
/
wordSize
);
assert
(
instance_size
==
align_object_size
(
align_size_up
(
(
instanceOopDesc
::
base_offset_in_bytes
()
+
nonstatic_field_size
*
heapOopSize
+
((
parsed_annotations
->
is_contended
())
?
pad_size
:
0
)
),
(
instanceOopDesc
::
base_offset_in_bytes
()
+
nonstatic_field_size
*
heapOopSize
),
wordSize
)
/
wordSize
),
"consistent layout helper value"
);
// Number of non-static oop map blocks allocated at end of klass.
...
...
test/runtime/contended/Inheritance1.java
0 → 100644
浏览文件 @
76074c76
/*
* Copyright (c) 2013, 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.
*/
import
java.io.BufferedReader
;
import
java.io.InputStreamReader
;
import
java.lang.Class
;
import
java.lang.String
;
import
java.lang.System
;
import
java.lang.management.ManagementFactory
;
import
java.lang.management.RuntimeMXBean
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.concurrent.CyclicBarrier
;
import
java.util.regex.Matcher
;
import
java.util.regex.Pattern
;
import
java.lang.reflect.Field
;
import
java.lang.reflect.Modifier
;
import
sun.misc.Unsafe
;
import
sun.misc.Contended
;
/*
* @test
* @bug 8012939
* @summary \@Contended doesn't work correctly with inheritance
*
* @run main/othervm -XX:-RestrictContended Inheritance1
*/
public
class
Inheritance1
{
private
static
final
Unsafe
U
;
private
static
int
ADDRESS_SIZE
;
private
static
int
HEADER_SIZE
;
static
{
// steal Unsafe
try
{
Field
unsafe
=
Unsafe
.
class
.
getDeclaredField
(
"theUnsafe"
);
unsafe
.
setAccessible
(
true
);
U
=
(
Unsafe
)
unsafe
.
get
(
null
);
}
catch
(
NoSuchFieldException
|
IllegalAccessException
e
)
{
throw
new
IllegalStateException
(
e
);
}
// When running with CompressedOops on 64-bit platform, the address size
// reported by Unsafe is still 8, while the real reference fields are 4 bytes long.
// Try to guess the reference field size with this naive trick.
try
{
long
off1
=
U
.
objectFieldOffset
(
CompressedOopsClass
.
class
.
getField
(
"obj1"
));
long
off2
=
U
.
objectFieldOffset
(
CompressedOopsClass
.
class
.
getField
(
"obj2"
));
ADDRESS_SIZE
=
(
int
)
Math
.
abs
(
off2
-
off1
);
HEADER_SIZE
=
(
int
)
Math
.
min
(
off1
,
off2
);
}
catch
(
NoSuchFieldException
e
)
{
ADDRESS_SIZE
=
-
1
;
}
}
static
class
CompressedOopsClass
{
public
Object
obj1
;
public
Object
obj2
;
}
public
static
boolean
arePaddedPairwise
(
Class
klass
,
String
field1
,
String
field2
)
throws
Exception
{
Field
f1
=
klass
.
getField
(
field1
);
Field
f2
=
klass
.
getField
(
field2
);
int
diff
=
offset
(
f1
)
-
offset
(
f2
);
if
(
diff
<
0
)
{
// f1 is first
return
(
offset
(
f2
)
-
(
offset
(
f1
)
+
getSize
(
f1
)))
>
64
;
}
else
{
// f2 is first
return
(
offset
(
f1
)
-
(
offset
(
f2
)
+
getSize
(
f2
)))
>
64
;
}
}
public
static
boolean
sameLayout
(
Class
klass1
,
Class
klass2
)
throws
Exception
{
for
(
Field
f1
:
klass1
.
getDeclaredFields
())
{
Field
f2
=
klass2
.
getDeclaredField
(
f1
.
getName
());
if
(
offset
(
f1
)
!=
offset
(
f2
))
{
return
false
;
}
}
for
(
Field
f2
:
klass1
.
getDeclaredFields
())
{
Field
f1
=
klass2
.
getDeclaredField
(
f2
.
getName
());
if
(
offset
(
f1
)
!=
offset
(
f2
))
{
return
false
;
}
}
return
true
;
}
public
static
boolean
isStatic
(
Field
field
)
{
return
Modifier
.
isStatic
(
field
.
getModifiers
());
}
public
static
int
offset
(
Field
field
)
{
if
(
isStatic
(
field
))
{
return
(
int
)
U
.
staticFieldOffset
(
field
);
}
else
{
return
(
int
)
U
.
objectFieldOffset
(
field
);
}
}
public
static
int
getSize
(
Field
field
)
{
Class
type
=
field
.
getType
();
if
(
type
==
byte
.
class
)
{
return
1
;
}
if
(
type
==
boolean
.
class
)
{
return
1
;
}
if
(
type
==
short
.
class
)
{
return
2
;
}
if
(
type
==
char
.
class
)
{
return
2
;
}
if
(
type
==
int
.
class
)
{
return
4
;
}
if
(
type
==
float
.
class
)
{
return
4
;
}
if
(
type
==
long
.
class
)
{
return
8
;
}
if
(
type
==
double
.
class
)
{
return
8
;
}
return
ADDRESS_SIZE
;
}
public
static
void
main
(
String
[]
args
)
throws
Exception
{
boolean
endResult
=
true
;
// --------------- INSTANCE FIELDS ---------------------
if
(!
arePaddedPairwise
(
A2_R1
.
class
,
"int1"
,
"int2"
))
{
System
.
err
.
println
(
"A2_R1 failed"
);
endResult
&=
false
;
}
if
(!
arePaddedPairwise
(
A3_R1
.
class
,
"int1"
,
"int2"
))
{
System
.
err
.
println
(
"A3_R1 failed"
);
endResult
&=
false
;
}
if
(!
arePaddedPairwise
(
A1_R2
.
class
,
"int1"
,
"int2"
))
{
System
.
err
.
println
(
"A1_R2 failed"
);
endResult
&=
false
;
}
if
(!
arePaddedPairwise
(
A2_R2
.
class
,
"int1"
,
"int2"
))
{
System
.
err
.
println
(
"A2_R2 failed"
);
endResult
&=
false
;
}
if
(!
arePaddedPairwise
(
A3_R2
.
class
,
"int1"
,
"int2"
))
{
System
.
err
.
println
(
"A3_R2 failed"
);
endResult
&=
false
;
}
if
(!
arePaddedPairwise
(
A1_R3
.
class
,
"int1"
,
"int2"
))
{
System
.
err
.
println
(
"A1_R3 failed"
);
endResult
&=
false
;
}
if
(!
arePaddedPairwise
(
A2_R3
.
class
,
"int1"
,
"int2"
))
{
System
.
err
.
println
(
"A2_R3 failed"
);
endResult
&=
false
;
}
if
(!
arePaddedPairwise
(
A3_R3
.
class
,
"int1"
,
"int2"
))
{
System
.
err
.
println
(
"A3_R3 failed"
);
endResult
&=
false
;
}
System
.
out
.
println
(
endResult
?
"Test PASSES"
:
"Test FAILS"
);
if
(!
endResult
)
{
throw
new
Error
(
"Test failed"
);
}
}
public
static
class
R1
{
public
int
int1
;
}
public
static
class
R2
{
@Contended
public
int
int1
;
}
@Contended
public
static
class
R3
{
public
int
int1
;
}
public
static
class
A1_R1
extends
R1
{
public
int
int2
;
}
public
static
class
A2_R1
extends
R1
{
@Contended
public
int
int2
;
}
@Contended
public
static
class
A3_R1
extends
R1
{
public
int
int2
;
}
public
static
class
A1_R2
extends
R2
{
public
int
int2
;
}
public
static
class
A2_R2
extends
R2
{
@Contended
public
int
int2
;
}
@Contended
public
static
class
A3_R2
extends
R2
{
public
int
int2
;
}
public
static
class
A1_R3
extends
R3
{
public
int
int2
;
}
public
static
class
A2_R3
extends
R3
{
@Contended
public
int
int2
;
}
@Contended
public
static
class
A3_R3
extends
R3
{
public
int
int2
;
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录