Mercurial > hg > openjdk > bsd-port > hotspot
changeset 5954:ca381ff70dd9
8050972: Concurrency problem in PcDesc cache
Summary: The entries of the PcDesc cache in nmethods are not declared as volatile, but they are accessed and modified by several threads concurrently.
Reviewed-by: kvn, dholmes
author | mdoerr |
---|---|
date | Thu, 17 Jul 2014 10:21:31 +0200 |
parents | 26cc28fac375 |
children | b11238ed5526 |
files | src/share/vm/code/nmethod.hpp |
diffstat | 1 files changed, 6 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/src/share/vm/code/nmethod.hpp Tue Jul 08 14:15:44 2014 +0200 +++ b/src/share/vm/code/nmethod.hpp Thu Jul 17 10:21:31 2014 +0200 @@ -69,7 +69,12 @@ friend class VMStructs; private: enum { cache_size = 4 }; - PcDesc* _pc_descs[cache_size]; // last cache_size pc_descs found + // The array elements MUST be volatile! Several threads may modify + // and read from the cache concurrently. find_pc_desc_internal has + // returned wrong results. C++ compiler (namely xlC12) may duplicate + // C++ field accesses if the elements are not volatile. + typedef PcDesc* PcDescPtr; + volatile PcDescPtr _pc_descs[cache_size]; // last cache_size pc_descs found public: PcDescCache() { debug_only(_pc_descs[0] = NULL); } void reset_to(PcDesc* initial_pc_desc);