提交 4750a563 编写于 作者: M manc

8223177: Data race on JvmtiEnvBase::_tag_map in double-checked locking

Summary: Add memory fences on accesses to JvmtiEnvBase::_tag_map
Reviewed-by: dholmes, jcbeyler, sspitsyn
上级 153e477f
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include "runtime/fieldDescriptor.hpp" #include "runtime/fieldDescriptor.hpp"
#include "runtime/frame.hpp" #include "runtime/frame.hpp"
#include "runtime/handles.inline.hpp" #include "runtime/handles.inline.hpp"
#include "runtime/orderAccess.hpp"
#include "runtime/thread.hpp" #include "runtime/thread.hpp"
#include "runtime/vm_operations.hpp" #include "runtime/vm_operations.hpp"
#include "utilities/growableArray.hpp" #include "utilities/growableArray.hpp"
...@@ -97,7 +98,7 @@ class JvmtiEnvBase : public CHeapObj<mtInternal> { ...@@ -97,7 +98,7 @@ class JvmtiEnvBase : public CHeapObj<mtInternal> {
const void *_env_local_storage; // per env agent allocated data. const void *_env_local_storage; // per env agent allocated data.
jvmtiEventCallbacks _event_callbacks; jvmtiEventCallbacks _event_callbacks;
jvmtiExtEventCallbacks _ext_event_callbacks; jvmtiExtEventCallbacks _ext_event_callbacks;
JvmtiTagMap* _tag_map; JvmtiTagMap* volatile _tag_map;
JvmtiEnvEventEnable _env_event_enable; JvmtiEnvEventEnable _env_event_enable;
jvmtiCapabilities _current_capabilities; jvmtiCapabilities _current_capabilities;
jvmtiCapabilities _prohibited_capabilities; jvmtiCapabilities _prohibited_capabilities;
...@@ -251,6 +252,13 @@ class JvmtiEnvBase : public CHeapObj<mtInternal> { ...@@ -251,6 +252,13 @@ class JvmtiEnvBase : public CHeapObj<mtInternal> {
return _tag_map; return _tag_map;
} }
JvmtiTagMap* acquire_tag_map() {
return (JvmtiTagMap*)OrderAccess::load_ptr_acquire(&_tag_map);
}
void release_set_tag_map(JvmtiTagMap* tag_map) {
OrderAccess::release_store_ptr(&_tag_map, tag_map);
}
// return true if event is enabled globally or for any thread // return true if event is enabled globally or for any thread
// True only if there is a callback for it. // True only if there is a callback for it.
......
...@@ -430,7 +430,7 @@ JvmtiTagMap::JvmtiTagMap(JvmtiEnv* env) : ...@@ -430,7 +430,7 @@ JvmtiTagMap::JvmtiTagMap(JvmtiEnv* env) :
_hashmap = new JvmtiTagHashmap(); _hashmap = new JvmtiTagHashmap();
// finally add us to the environment // finally add us to the environment
((JvmtiEnvBase *)env)->set_tag_map(this); ((JvmtiEnvBase *)env)->release_set_tag_map(this);
} }
...@@ -499,7 +499,7 @@ void JvmtiTagMap::destroy_entry(JvmtiTagHashmapEntry* entry) { ...@@ -499,7 +499,7 @@ void JvmtiTagMap::destroy_entry(JvmtiTagHashmapEntry* entry) {
// returns the tag map for the given environments. If the tag map // returns the tag map for the given environments. If the tag map
// doesn't exist then it is created. // doesn't exist then it is created.
JvmtiTagMap* JvmtiTagMap::tag_map_for(JvmtiEnv* env) { JvmtiTagMap* JvmtiTagMap::tag_map_for(JvmtiEnv* env) {
JvmtiTagMap* tag_map = ((JvmtiEnvBase*)env)->tag_map(); JvmtiTagMap* tag_map = ((JvmtiEnvBase*)env)->acquire_tag_map();
if (tag_map == NULL) { if (tag_map == NULL) {
MutexLocker mu(JvmtiThreadState_lock); MutexLocker mu(JvmtiThreadState_lock);
tag_map = ((JvmtiEnvBase*)env)->tag_map(); tag_map = ((JvmtiEnvBase*)env)->tag_map();
...@@ -3282,7 +3282,7 @@ void JvmtiTagMap::weak_oops_do(BoolObjectClosure* is_alive, OopClosure* f) { ...@@ -3282,7 +3282,7 @@ void JvmtiTagMap::weak_oops_do(BoolObjectClosure* is_alive, OopClosure* f) {
if (JvmtiEnv::environments_might_exist()) { if (JvmtiEnv::environments_might_exist()) {
JvmtiEnvIterator it; JvmtiEnvIterator it;
for (JvmtiEnvBase* env = it.first(); env != NULL; env = it.next(env)) { for (JvmtiEnvBase* env = it.first(); env != NULL; env = it.next(env)) {
JvmtiTagMap* tag_map = env->tag_map(); JvmtiTagMap* tag_map = env->acquire_tag_map();
if (tag_map != NULL && !tag_map->is_empty()) { if (tag_map != NULL && !tag_map->is_empty()) {
tag_map->do_weak_oops(is_alive, f); tag_map->do_weak_oops(is_alive, f);
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册