8216987: ciMethodData::load_data() unpacks MDOs with non-atomic copy

Reviewed-by: kvn, mdoerr, thartmann
This commit is contained in:
Erik Österlund 2019-01-29 10:13:23 +01:00
parent 76946b97e4
commit 51e2252a73

View File

@ -208,15 +208,17 @@ void ciMethodData::load_data() {
// Snapshot the data -- actually, take an approximate snapshot of
// the data. Any concurrently executing threads may be changing the
// data as we copy it.
Copy::disjoint_words((HeapWord*) mdo,
(HeapWord*) &_orig,
sizeof(_orig) / HeapWordSize);
Copy::disjoint_words_atomic((HeapWord*) mdo,
(HeapWord*) &_orig,
sizeof(_orig) / HeapWordSize);
Arena* arena = CURRENT_ENV->arena();
_data_size = mdo->data_size();
_extra_data_size = mdo->extra_data_size();
int total_size = _data_size + _extra_data_size;
_data = (intptr_t *) arena->Amalloc(total_size);
Copy::disjoint_words((HeapWord*) mdo->data_base(), (HeapWord*) _data, total_size / HeapWordSize);
Copy::disjoint_words_atomic((HeapWord*) mdo->data_base(),
(HeapWord*) _data,
total_size / HeapWordSize);
// Traverse the profile data, translating any oops into their
// ci equivalents.