Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_hotspot
提交
17949333
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看板
体验新版 GitCode,发现更多精彩内容 >>
提交
17949333
编写于
5月 16, 2013
作者:
D
dholmes
浏览文件
操作
浏览文件
下载
差异文件
Merge
上级
ee3e983b
bb092934
变更
2
显示空白变更内容
内联
并排
Showing
2 changed file
with
202 addition
and
4 deletion
+202
-4
src/share/vm/classfile/classFileParser.cpp
src/share/vm/classfile/classFileParser.cpp
+17
-4
test/runtime/contended/DefaultValue.java
test/runtime/contended/DefaultValue.java
+185
-0
未找到文件。
src/share/vm/classfile/classFileParser.cpp
浏览文件 @
17949333
...
@@ -1719,16 +1719,29 @@ void ClassFileParser::parse_annotations(u1* buffer, int limit,
...
@@ -1719,16 +1719,29 @@ void ClassFileParser::parse_annotations(u1* buffer, int limit,
coll
->
set_annotation
(
id
);
coll
->
set_annotation
(
id
);
if
(
id
==
AnnotationCollector
::
_sun_misc_Contended
)
{
if
(
id
==
AnnotationCollector
::
_sun_misc_Contended
)
{
// @Contended can optionally specify the contention group.
//
// Contended group defines the equivalence class over the fields:
// the fields within the same contended group are not treated distinct.
// The only exception is default group, which does not incur the
// equivalence. Naturally, contention group for classes is meaningless.
//
// While the contention group is specified as String, annotation
// values are already interned, and we might as well use the constant
// pool index as the group tag.
//
u2
group_index
=
0
;
// default contended group
if
(
count
==
1
if
(
count
==
1
&&
s_size
==
(
index
-
index0
)
// match size
&&
s_size
==
(
index
-
index0
)
// match size
&&
s_tag_val
==
*
(
abase
+
tag_off
)
&&
s_tag_val
==
*
(
abase
+
tag_off
)
&&
member
==
vmSymbols
::
value_name
())
{
&&
member
==
vmSymbols
::
value_name
())
{
u2
group_index
=
Bytes
::
get_Java_u2
(
abase
+
s_con_off
);
group_index
=
Bytes
::
get_Java_u2
(
abase
+
s_con_off
);
coll
->
set_contended_group
(
group_index
);
if
(
_cp
->
symbol_at
(
group_index
)
->
utf8_length
()
==
0
)
{
}
else
{
group_index
=
0
;
// default contended group
coll
->
set_contended_group
(
0
);
// default contended group
}
}
}
}
coll
->
set_contended_group
(
group_index
);
}
}
}
}
}
...
...
test/runtime/contended/DefaultValue.java
0 → 100644
浏览文件 @
17949333
/*
* 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 8014509
* @summary \@Contended: explicit default value behaves differently from the implicit value
*
* @run main/othervm -XX:-RestrictContended DefaultValue
*/
public
class
DefaultValue
{
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
;
if
(!
arePaddedPairwise
(
R1
.
class
,
"int1"
,
"int2"
))
{
System
.
err
.
println
(
"R1 failed"
);
endResult
&=
false
;
}
if
(!
arePaddedPairwise
(
R2
.
class
,
"int1"
,
"int2"
))
{
System
.
err
.
println
(
"R2 failed"
);
endResult
&=
false
;
}
if
(!
arePaddedPairwise
(
R3
.
class
,
"int1"
,
"int2"
))
{
System
.
err
.
println
(
"R3 failed"
);
endResult
&=
false
;
}
System
.
out
.
println
(
endResult
?
"Test PASSES"
:
"Test FAILS"
);
if
(!
endResult
)
{
throw
new
Error
(
"Test failed"
);
}
}
public
static
class
R1
{
@Contended
public
int
int1
;
@Contended
public
int
int2
;
}
public
static
class
R2
{
@Contended
(
""
)
public
int
int1
;
@Contended
(
""
)
public
int
int2
;
}
public
static
class
R3
{
@Contended
()
public
int
int1
;
@Contended
()
public
int
int2
;
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录