From 9123c60fe24bf4b0ae9472a7e80c43d695981e13 Mon Sep 17 00:00:00 2001 From: liu-zelin Date: Sat, 9 Aug 2025 09:01:55 +0800 Subject: [PATCH] fix appfreeze of run -l ActsAsyncLockUtilsTest Issue: https://gitee.com/openharmony/commonlibrary_ets_utils/issues/ICS5DW?from=project-issue Signed-off-by: liu-zelin Change-Id: Ie6e604202f990d2ef1adb7bb0913e7c624c5d105 --- js_concurrent_module/utils/locks/async_lock.cpp | 12 +++++++++--- js_concurrent_module/utils/locks/async_lock.h | 1 + 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/js_concurrent_module/utils/locks/async_lock.cpp b/js_concurrent_module/utils/locks/async_lock.cpp index d54ace55..db85e8a1 100644 --- a/js_concurrent_module/utils/locks/async_lock.cpp +++ b/js_concurrent_module/utils/locks/async_lock.cpp @@ -41,7 +41,6 @@ napi_value AsyncLock::LockAsync(napi_env env, napi_ref cb, LockMode mode, const ErrorHelper::ThrowError(env, ErrorHelper::TYPE_ERROR, "env is not alive"); return nullptr; } - std::unique_lock lock(asyncLockMutex_); if (!CanAcquireLock(mode) && options.isAvailable) { napi_value err; NAPI_CALL(env, napi_create_string_utf8(env, "The lock is acquired", NAPI_AUTO_LENGTH, &err)); @@ -49,6 +48,7 @@ napi_value AsyncLock::LockAsync(napi_env env, napi_ref cb, LockMode mode, const } else { LockRequest *lockRequest = new LockRequest(this, AsyncLockManager::GetCurrentTid(env), env, cb, mode, options, deferred); + std::unique_lock lock(asyncLockMutex_); pendingList_.push_back(lockRequest); ProcessPendingLockRequestUnsafe(env, lockRequest); } @@ -124,7 +124,7 @@ void AsyncLock::ProcessPendingLockRequest(napi_env env, LockRequest* syncLockReq void AsyncLock::ProcessPendingLockRequestUnsafe(napi_env env, LockRequest *syncLockRequest) { LockRequest *lockRequest = pendingList_.front(); - if (!CanAcquireLock(lockRequest->GetMode())) { + if (!CanAcquireLockUnsafe(lockRequest->GetMode())) { return; } lockStatus_ = lockRequest->GetMode(); @@ -145,7 +145,7 @@ void AsyncLock::ProcessPendingLockRequestUnsafe(napi_env env, LockRequest *syncL } } -bool AsyncLock::CanAcquireLock(LockMode mode) +bool AsyncLock::CanAcquireLockUnsafe(LockMode mode) { if (heldList_.empty()) { return true; @@ -159,6 +159,12 @@ bool AsyncLock::CanAcquireLock(LockMode mode) return false; } +bool AsyncLock::CanAcquireLock(LockMode mode) +{ + std::unique_lock lock(asyncLockMutex_); + return CanAcquireLockUnsafe(mode); +} + napi_status AsyncLock::FillLockState(napi_env env, napi_value held, napi_value pending) { std::unique_lock lock(asyncLockMutex_); diff --git a/js_concurrent_module/utils/locks/async_lock.h b/js_concurrent_module/utils/locks/async_lock.h index e2ec0262..f2194cfe 100644 --- a/js_concurrent_module/utils/locks/async_lock.h +++ b/js_concurrent_module/utils/locks/async_lock.h @@ -64,6 +64,7 @@ public: } private: + bool CanAcquireLockUnsafe(LockMode mode); bool CanAcquireLock(LockMode mode); napi_value CreateLockInfo(napi_env env, const LockRequest *rq); template -- Gitee