mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-21 11:34:38 +02:00
7018302: newly added assert related to size of constantPoolOop causes secondary assertions or crashes
6912621 used a raw oop in the newly added assert following an allocation attempt that could result in a GC. Reviewed-by: jmasa
This commit is contained in:
parent
7334402db5
commit
2c35cde750
1 changed files with 19 additions and 16 deletions
|
@ -55,32 +55,35 @@
|
||||||
constantPoolOop constantPoolKlass::allocate(int length, bool is_conc_safe, TRAPS) {
|
constantPoolOop constantPoolKlass::allocate(int length, bool is_conc_safe, TRAPS) {
|
||||||
int size = constantPoolOopDesc::object_size(length);
|
int size = constantPoolOopDesc::object_size(length);
|
||||||
KlassHandle klass (THREAD, as_klassOop());
|
KlassHandle klass (THREAD, as_klassOop());
|
||||||
|
assert(klass()->is_oop(), "Can't be null, else handlizing of c below won't work");
|
||||||
|
constantPoolHandle pool;
|
||||||
|
{
|
||||||
constantPoolOop c =
|
constantPoolOop c =
|
||||||
(constantPoolOop)CollectedHeap::permanent_obj_allocate(klass, size, CHECK_NULL);
|
(constantPoolOop)CollectedHeap::permanent_obj_allocate(klass, size, CHECK_NULL);
|
||||||
|
assert(c->klass_or_null() != NULL, "Handlizing below won't work");
|
||||||
|
pool = constantPoolHandle(THREAD, c);
|
||||||
|
}
|
||||||
|
|
||||||
c->set_length(length);
|
pool->set_length(length);
|
||||||
c->set_tags(NULL);
|
pool->set_tags(NULL);
|
||||||
c->set_cache(NULL);
|
pool->set_cache(NULL);
|
||||||
c->set_operands(NULL);
|
pool->set_operands(NULL);
|
||||||
c->set_pool_holder(NULL);
|
pool->set_pool_holder(NULL);
|
||||||
c->set_flags(0);
|
pool->set_flags(0);
|
||||||
// only set to non-zero if constant pool is merged by RedefineClasses
|
// only set to non-zero if constant pool is merged by RedefineClasses
|
||||||
c->set_orig_length(0);
|
pool->set_orig_length(0);
|
||||||
// if constant pool may change during RedefineClasses, it is created
|
// if constant pool may change during RedefineClasses, it is created
|
||||||
// unsafe for GC concurrent processing.
|
// unsafe for GC concurrent processing.
|
||||||
c->set_is_conc_safe(is_conc_safe);
|
pool->set_is_conc_safe(is_conc_safe);
|
||||||
// all fields are initialized; needed for GC
|
// all fields are initialized; needed for GC
|
||||||
|
|
||||||
// Note: because we may be in this "conc_unsafe" state when allocating
|
// Note: because we may be in this "conc_unsafe" state when allocating
|
||||||
// t_oop below, which may in turn cause a GC, it is imperative that our
|
// t_oop below, which may in turn cause a GC, it is imperative that our
|
||||||
// size be correct, consistent and henceforth stable, at this stage.
|
// size be correct, consistent and henceforth stable, at this stage.
|
||||||
assert(c->is_parsable(), "Else size() below is unreliable");
|
assert(pool->is_oop() && pool->is_parsable(), "Else size() below is unreliable");
|
||||||
DEBUG_ONLY(int sz = c->size();)
|
assert(size == pool->size(), "size() is wrong");
|
||||||
|
|
||||||
// initialize tag array
|
// initialize tag array
|
||||||
// Note: cannot introduce constant pool handle before since it is not
|
|
||||||
// completely initialized (no class) -> would cause assertion failure
|
|
||||||
constantPoolHandle pool (THREAD, c);
|
|
||||||
typeArrayOop t_oop = oopFactory::new_permanent_byteArray(length, CHECK_NULL);
|
typeArrayOop t_oop = oopFactory::new_permanent_byteArray(length, CHECK_NULL);
|
||||||
typeArrayHandle tags (THREAD, t_oop);
|
typeArrayHandle tags (THREAD, t_oop);
|
||||||
for (int index = 0; index < length; index++) {
|
for (int index = 0; index < length; index++) {
|
||||||
|
@ -89,7 +92,7 @@ constantPoolOop constantPoolKlass::allocate(int length, bool is_conc_safe, TRAPS
|
||||||
pool->set_tags(tags());
|
pool->set_tags(tags());
|
||||||
|
|
||||||
// Check that our size was stable at its old value.
|
// Check that our size was stable at its old value.
|
||||||
assert(sz == c->size(), "size() changed");
|
assert(size == pool->size(), "size() changed");
|
||||||
return pool();
|
return pool();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue