8050972: Concurrency problem in PcDesc cache

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, dcubed
This commit is contained in:
Martin Doerr 2014-07-17 10:21:31 +02:00
parent 33058abb3f
commit 1439e307db

View File

@ -69,7 +69,12 @@ class PcDescCache VALUE_OBJ_CLASS_SPEC {
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);