# HG changeset patch # User roland # Date 1423485959 -3600 # Node ID a11a29cf06d5911451242c7475fa35b2fbaeaa69 # Parent 4df7f6cfac990692deca1c24e039a5017f8d5183 8071821: Assert failed in UnexpectedDeoptimizationTest.java Summary: assert fires in case of concurrent initialization of ciInstanceKlass::_has_injected_fields Reviewed-by: kvn diff -r 4df7f6cfac99 -r a11a29cf06d5 hotspot/src/share/vm/ci/ciInstanceKlass.cpp --- a/hotspot/src/share/vm/ci/ciInstanceKlass.cpp Mon Feb 09 15:10:58 2015 +0100 +++ b/hotspot/src/share/vm/ci/ciInstanceKlass.cpp Mon Feb 09 13:45:59 2015 +0100 @@ -501,32 +501,31 @@ return fields; } -void ciInstanceKlass::compute_injected_fields_helper() { +bool ciInstanceKlass::compute_injected_fields_helper() { ASSERT_IN_VM; InstanceKlass* k = get_instanceKlass(); for (InternalFieldStream fs(k); !fs.done(); fs.next()) { if (fs.access_flags().is_static()) continue; - _has_injected_fields++; - break; + return true; } + return false; } -bool ciInstanceKlass::compute_injected_fields() { - assert(_has_injected_fields == -1, "shouldn't be initialized yet"); +void ciInstanceKlass::compute_injected_fields() { assert(is_loaded(), "must be loaded"); + int has_injected_fields = 0; if (super() != NULL && super()->has_injected_fields()) { - _has_injected_fields = 1; - return true; + has_injected_fields = 1; + } else { + GUARDED_VM_ENTRY({ + has_injected_fields = compute_injected_fields_helper() ? 1 : 0; + }); } - - _has_injected_fields = 0; - GUARDED_VM_ENTRY({ - compute_injected_fields_helper(); - }); - - return _has_injected_fields > 0 ? true : false; + // may be concurrently initialized for shared ciInstanceKlass objects + assert(_has_injected_fields == -1 || _has_injected_fields == has_injected_fields, "broken concurrent initialization"); + _has_injected_fields = has_injected_fields; } // ------------------------------------------------------------------ diff -r 4df7f6cfac99 -r a11a29cf06d5 hotspot/src/share/vm/ci/ciInstanceKlass.hpp --- a/hotspot/src/share/vm/ci/ciInstanceKlass.hpp Mon Feb 09 15:10:58 2015 +0100 +++ b/hotspot/src/share/vm/ci/ciInstanceKlass.hpp Mon Feb 09 13:45:59 2015 +0100 @@ -72,8 +72,8 @@ // Itsef: more than one implementors. ciInstanceKlass* _implementor; - bool compute_injected_fields(); - void compute_injected_fields_helper(); + void compute_injected_fields(); + bool compute_injected_fields_helper(); protected: ciInstanceKlass(KlassHandle h_k); @@ -193,7 +193,7 @@ bool has_injected_fields() { if (_has_injected_fields == -1) { - return compute_injected_fields(); + compute_injected_fields(); } return _has_injected_fields > 0 ? true : false; }