!9317 Fix share module lock invalid

Merge pull request !9317 from yaochaonan/mutex
This commit is contained in:
openharmony_ci 2024-09-18 19:36:54 +00:00 committed by Gitee
commit fe5c97799c
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
3 changed files with 8 additions and 41 deletions

View File

@ -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<SourceTextModule> &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<SourceTextModule> &module)
{
return GetModuleEvaluatingType(thread, stateVisit, module) == ModuleStatus::INSTANTIATED;
}
bool SourceTextModule::WaitModuleEvaluated([[maybe_unused]] JSThread *thread, StateVisit &stateVisit,
[[maybe_unused]] const JSHandle<SourceTextModule> &module)
{
RuntimeLockHolder locker(thread, stateVisit.mutex);
stateVisit.cv.Wait(&stateVisit.mutex);
return true;
}
ModuleStatus SourceTextModule::GetModuleEvaluatingType(JSThread *thread, StateVisit &stateVisit,
const JSHandle<SourceTextModule> &module)
{
@ -1184,17 +1160,17 @@ int SourceTextModule::InnerModuleEvaluation(JSThread *thread, const JSHandle<Sou
return SourceTextModule::InnerModuleEvaluationUnsafe(
thread, moduleRecord, stack, index, buffer, size, executeFromJob);
} else {
StateVisit stateVisit = SharedModuleManager::GetInstance()->findModuleMutexWithLock(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;
}

View File

@ -213,15 +213,6 @@ public:
static bool IsEvaluatedModule(JSThread *thread, StateVisit &stateVisit,
const JSHandle<SourceTextModule> &module);
static bool IsEvaluatingModule(JSThread *thread, StateVisit &stateVisit,
const JSHandle<SourceTextModule> &module);
static bool IsInstaniatedModule(JSThread *thread, StateVisit &stateVisit,
const JSHandle<SourceTextModule> &module);
static bool WaitModuleEvaluated(JSThread *thread, StateVisit &stateVisit,
const JSHandle<SourceTextModule> &module);
static ModuleStatus GetModuleEvaluatingType(JSThread *thread, StateVisit &stateVisit,
const JSHandle<SourceTextModule> &module);

View File

@ -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));
}
}