diff --git a/vm/vmcore/include/environment.h b/vm/vmcore/include/environment.h index 2fe1b4e..92f7ec8 100644 --- a/vm/vmcore/include/environment.h +++ b/vm/vmcore/include/environment.h @@ -78,6 +78,7 @@ struct Global_Env { Lock_Manager *p_meth_addr_table_lock; Lock_Manager *p_method_call_lock; Lock_Manager *p_handle_lock; + Lock_Manager *p_dclist_lock; /** * If set to true by the -compact_fields command-line option, diff --git a/vm/vmcore/src/class_support/Environment.cpp b/vm/vmcore/src/class_support/Environment.cpp index 445bcc0..c1e6677 100644 --- a/vm/vmcore/src/class_support/Environment.cpp +++ b/vm/vmcore/src/class_support/Environment.cpp @@ -145,6 +145,7 @@ #endif // !_IPF_ p_meth_addr_table_lock = new Lock_Manager(); p_handle_lock = new Lock_Manager(); p_method_call_lock = new Lock_Manager(); + p_dclist_lock = new Lock_Manager(); // // preloaded classes @@ -245,6 +246,7 @@ Global_Env::~Global_Env() delete p_meth_addr_table_lock; delete p_handle_lock; delete p_method_call_lock; + delete p_dclist_lock; // Unload jit instances. vm_delete_all_jits(); diff --git a/vm/vmcore/src/jit/compile.cpp b/vm/vmcore/src/jit/compile.cpp index f2342a7..53aa123 100644 --- a/vm/vmcore/src/jit/compile.cpp +++ b/vm/vmcore/src/jit/compile.cpp @@ -807,13 +807,16 @@ DynamicCode* compile_get_dynamic_code_li // Adding dynamic generated code info to global list void compile_add_dynamic_generated_code_chunk(const char* name, const void* address, jint length) { - DynamicCode** pdcList = &VM_Global_State::loader_env->dcList; - // FIXME linked list modification without synchronization DynamicCode *dc = (DynamicCode *)STD_MALLOC(sizeof(DynamicCode)); assert(dc); dc->name = name; dc->address = address; dc->length = length; + + // Synchronizing access to dynamic code list + LMAutoUnlock dcll(VM_Global_State::loader_env->p_dclist_lock); + + DynamicCode** pdcList = &VM_Global_State::loader_env->dcList; dc->next = *pdcList; *pdcList = dc; } diff --git a/vm/vmcore/src/jvmti/jvmti_event.cpp b/vm/vmcore/src/jvmti/jvmti_event.cpp index 2088489..ff668b1 100644 --- a/vm/vmcore/src/jvmti/jvmti_event.cpp +++ b/vm/vmcore/src/jvmti/jvmti_event.cpp @@ -611,10 +611,15 @@ jvmtiGenerateEvents(jvmtiEnv* env, } else { - // FIXME: linked list usage without sync + Lock_Manager* dclock = VM_Global_State::loader_env->p_dclist_lock; + // Synchronizing access to dynamic code list + dclock->_lock(); + for (DynamicCode *dcList = compile_get_dynamic_code_list(); NULL != dcList; dcList = dcList->next) jvmti_send_dynamic_code_generated_event(dcList->name, dcList->address, dcList->length); + + dclock->_unlock(); } return JVMTI_ERROR_NONE; diff --git a/vm/vmcore/src/util/native_stack.cpp b/vm/vmcore/src/util/native_stack.cpp index d6d639d..2b46cd6 100644 --- a/vm/vmcore/src/util/native_stack.cpp +++ b/vm/vmcore/src/util/native_stack.cpp @@ -80,6 +80,9 @@ bool native_is_ip_in_modules(native_modu bool native_is_ip_stub(void* ip) { + // Synchronizing access to dynamic code list + LMAutoUnlock dcll(VM_Global_State::loader_env->p_dclist_lock); + for (DynamicCode *dcList = compile_get_dynamic_code_list(); NULL != dcList; dcList = dcList->next) {