From 3b64e9b609096607cbfcf090ff681b55ad4daf38 Mon Sep 17 00:00:00 2001 From: yaochaonan Date: Sat, 14 Sep 2024 00:17:35 +0800 Subject: [PATCH] Fix share module lock invalid Issue: https://gitee.com/openharmony/arkcompiler_ets_runtime/issues/IARBP2?from=project-issue Signed-off-by: yaochaonan Change-Id: Ia000face2e68fda6b3f95a644659d06dbe7441ba --- ecmascript/module/js_module_source_text.cpp | 38 ++++--------------- ecmascript/module/js_module_source_text.h | 9 ----- .../module/js_shared_module_manager.cpp | 2 +- 3 files changed, 8 insertions(+), 41 deletions(-) diff --git a/ecmascript/module/js_module_source_text.cpp b/ecmascript/module/js_module_source_text.cpp index c7486cdb72..2415a4c500 100644 --- a/ecmascript/module/js_module_source_text.cpp +++ b/ecmascript/module/js_module_source_text.cpp @@ -1143,30 +1143,6 @@ bool SourceTextModule::IsEvaluatedModule(JSThread *thread, StateVisit &stateVisi return GetModuleEvaluatingType(thread, stateVisit, module) == ModuleStatus::EVALUATED; } -bool SourceTextModule::IsEvaluatingModule(JSThread *thread, StateVisit &stateVisit, - const JSHandle &module) -{ - auto state = GetModuleEvaluatingType(thread, stateVisit, module); - if (state == ModuleStatus::EVALUATING_ASYNC) { - LOG_FULL(INFO) << "EVALUATING_ASYNC state module appear."; - } - return state == ModuleStatus::EVALUATING || state == ModuleStatus::EVALUATING_ASYNC; -} - -bool SourceTextModule::IsInstaniatedModule(JSThread *thread, StateVisit &stateVisit, - const JSHandle &module) -{ - return GetModuleEvaluatingType(thread, stateVisit, module) == ModuleStatus::INSTANTIATED; -} - -bool SourceTextModule::WaitModuleEvaluated([[maybe_unused]] JSThread *thread, StateVisit &stateVisit, - [[maybe_unused]] const JSHandle &module) -{ - RuntimeLockHolder locker(thread, stateVisit.mutex); - stateVisit.cv.Wait(&stateVisit.mutex); - return true; -} - ModuleStatus SourceTextModule::GetModuleEvaluatingType(JSThread *thread, StateVisit &stateVisit, const JSHandle &module) { @@ -1184,17 +1160,17 @@ int SourceTextModule::InnerModuleEvaluation(JSThread *thread, const JSHandlefindModuleMutexWithLock(thread, module); - if (IsInstaniatedModule(thread, stateVisit, module)) { - RuntimeLockHolder locker(thread, stateVisit.mutex); + StateVisit &stateVisit = SharedModuleManager::GetInstance()->findModuleMutexWithLock(thread, module); + if (module->GetStatus() == ModuleStatus::EVALUATING && + stateVisit.threadId == thread->GetThreadId()) { + return index; + } + RuntimeLockHolder locker(thread, stateVisit.mutex); + if (module->GetStatus() == ModuleStatus::INSTANTIATED) { stateVisit.threadId = thread->GetThreadId(); int idx = SourceTextModule::InnerModuleEvaluationUnsafe( thread, moduleRecord, stack, index, buffer, size, executeFromJob); - stateVisit.cv.SignalAll(); return idx; - } else if (IsEvaluatingModule(thread, stateVisit, module) && - !(stateVisit.threadId != thread->GetThreadId())) { - WaitModuleEvaluated(thread, stateVisit, module); } return index; } diff --git a/ecmascript/module/js_module_source_text.h b/ecmascript/module/js_module_source_text.h index 7a9beed10a..cfde80494b 100644 --- a/ecmascript/module/js_module_source_text.h +++ b/ecmascript/module/js_module_source_text.h @@ -213,15 +213,6 @@ public: static bool IsEvaluatedModule(JSThread *thread, StateVisit &stateVisit, const JSHandle &module); - static bool IsEvaluatingModule(JSThread *thread, StateVisit &stateVisit, - const JSHandle &module); - - static bool IsInstaniatedModule(JSThread *thread, StateVisit &stateVisit, - const JSHandle &module); - - static bool WaitModuleEvaluated(JSThread *thread, StateVisit &stateVisit, - const JSHandle &module); - static ModuleStatus GetModuleEvaluatingType(JSThread *thread, StateVisit &stateVisit, const JSHandle &module); diff --git a/ecmascript/module/js_shared_module_manager.cpp b/ecmascript/module/js_shared_module_manager.cpp index c02274ebc4..d7698db98b 100644 --- a/ecmascript/module/js_shared_module_manager.cpp +++ b/ecmascript/module/js_shared_module_manager.cpp @@ -214,7 +214,7 @@ void SharedModuleManager::InsertInSModuleManager(JSThread *thread, const CString if (!SearchInSModuleManagerUnsafe(recordName)) { AddResolveImportedSModule(recordName, module.GetTaggedValue()); StateVisit stateVisit; - sharedModuleMutex_.emplace(recordName, stateVisit); + sharedModuleMutex_.emplace(recordName, std::move(stateVisit)); } }