--- old/src/share/vm/ci/ciInstanceKlass.cpp 2015-02-10 09:58:17.553222856 +0100 +++ new/src/share/vm/ci/ciInstanceKlass.cpp 2015-02-10 09:58:17.379454151 +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; } // ------------------------------------------------------------------