# HG changeset patch # User aph # Date 1531146945 -3600 # Mon Jul 09 15:35:45 2018 +0100 # Node ID 2b333c0f66d1381662ef3405f487fac776d59810 # Parent af28aad8c568101fdec80d6646b0f385b4b8f64f 8206406: StubCodeDesc constructor publishes partially-constructed objects on StubCodeDesc::_list Reviewed-by: dholmes diff --git a/src/share/vm/runtime/stubCodeGenerator.cpp b/src/share/vm/runtime/stubCodeGenerator.cpp --- a/src/share/vm/runtime/stubCodeGenerator.cpp +++ b/src/share/vm/runtime/stubCodeGenerator.cpp @@ -34,12 +34,12 @@ // Implementation of StubCodeDesc -StubCodeDesc* StubCodeDesc::_list = NULL; -int StubCodeDesc::_count = 0; +StubCodeDesc* volatile StubCodeDesc::_list = NULL; +int StubCodeDesc::_count = 0; StubCodeDesc* StubCodeDesc::desc_for(address pc) { - StubCodeDesc* p = _list; + StubCodeDesc* p = (StubCodeDesc*)OrderAccess::load_ptr_acquire(&_list); while (p != NULL && !p->contains(pc)) p = p->_next; // p == NULL || p->contains(pc) return p; @@ -47,7 +47,7 @@ StubCodeDesc* StubCodeDesc::desc_for_index(int index) { - StubCodeDesc* p = _list; + StubCodeDesc* p = (StubCodeDesc*)OrderAccess::load_ptr_acquire(&_list); while (p != NULL && p->index() != index) p = p->_next; return p; } diff --git a/src/share/vm/runtime/stubCodeGenerator.hpp b/src/share/vm/runtime/stubCodeGenerator.hpp --- a/src/share/vm/runtime/stubCodeGenerator.hpp +++ b/src/share/vm/runtime/stubCodeGenerator.hpp @@ -38,7 +38,7 @@ class StubCodeDesc: public CHeapObj { protected: - static StubCodeDesc* _list; // the list of all descriptors + static StubCodeDesc* volatile _list; // the list of all descriptors static int _count; // length of list StubCodeDesc* _next; // the next element in the linked list @@ -69,13 +69,13 @@ StubCodeDesc(const char* group, const char* name, address begin) { assert(name != NULL, "no name specified"); - _next = _list; + _next = (StubCodeDesc*)OrderAccess::load_ptr_acquire(&_list); _group = group; _name = name; _index = ++_count; // (never zero) _begin = begin; _end = NULL; - _list = this; + OrderAccess::release_store_ptr(&_list, this); }; const char* group() const { return _group; }