7011386: race in objArrayKlass::array_klass_impl
Summary: Move _lower_dimension field initialization before _higher_dimension and add storestore barrier.
Reviewed-by: dholmes, iveresov, never
--- a/hotspot/src/share/vm/oops/arrayKlass.hpp Mon Jan 10 18:46:29 2011 -0800
+++ b/hotspot/src/share/vm/oops/arrayKlass.hpp Tue Jan 11 20:26:13 2011 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2011, 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
@@ -36,8 +36,8 @@
friend class VMStructs;
private:
int _dimension; // This is n'th-dimensional array.
- klassOop _higher_dimension; // Refers the (n+1)'th-dimensional array (if present).
- klassOop _lower_dimension; // Refers the (n-1)'th-dimensional array (if present).
+ volatile klassOop _higher_dimension; // Refers the (n+1)'th-dimensional array (if present).
+ volatile klassOop _lower_dimension; // Refers the (n-1)'th-dimensional array (if present).
int _vtable_len; // size of vtable for this klass
juint _alloc_size; // allocation profiling support
oop _component_mirror; // component type, as a java/lang/Class
--- a/hotspot/src/share/vm/oops/objArrayKlass.cpp Mon Jan 10 18:46:29 2011 -0800
+++ b/hotspot/src/share/vm/oops/objArrayKlass.cpp Tue Jan 11 20:26:13 2011 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2011, 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
@@ -235,8 +235,9 @@
objArrayKlassKlass::cast(Universe::objArrayKlassKlassObj())->
allocate_objArray_klass(dimension + 1, this_oop, CHECK_NULL);
ak = objArrayKlassHandle(THREAD, new_klass);
+ ak->set_lower_dimension(this_oop());
+ OrderAccess::storestore();
this_oop->set_higher_dimension(ak());
- ak->set_lower_dimension(this_oop());
assert(ak->oop_is_objArray(), "incorrect initialization of objArrayKlass");
}
}
--- a/hotspot/src/share/vm/oops/typeArrayKlass.cpp Mon Jan 10 18:46:29 2011 -0800
+++ b/hotspot/src/share/vm/oops/typeArrayKlass.cpp Tue Jan 11 20:26:13 2011 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2011, 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
@@ -179,6 +179,7 @@
dimension + 1, h_this, CHECK_NULL);
h_ak = objArrayKlassHandle(THREAD, oak);
h_ak->set_lower_dimension(h_this());
+ OrderAccess::storestore();
h_this->set_higher_dimension(h_ak());
assert(h_ak->oop_is_objArray(), "incorrect initialization of objArrayKlass");
}
--- a/hotspot/src/share/vm/runtime/vmStructs.cpp Mon Jan 10 18:46:29 2011 -0800
+++ b/hotspot/src/share/vm/runtime/vmStructs.cpp Tue Jan 11 20:26:13 2011 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2011, 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
@@ -219,8 +219,8 @@
volatile_nonstatic_field(oopDesc, _metadata._compressed_klass, narrowOop) \
static_field(oopDesc, _bs, BarrierSet*) \
nonstatic_field(arrayKlass, _dimension, int) \
- nonstatic_field(arrayKlass, _higher_dimension, klassOop) \
- nonstatic_field(arrayKlass, _lower_dimension, klassOop) \
+ volatile_nonstatic_field(arrayKlass, _higher_dimension, klassOop) \
+ volatile_nonstatic_field(arrayKlass, _lower_dimension, klassOop) \
nonstatic_field(arrayKlass, _vtable_len, int) \
nonstatic_field(arrayKlass, _alloc_size, juint) \
nonstatic_field(arrayKlass, _component_mirror, oop) \