From 49c68563caa549e385e9970ffa1f64ebb00ccff7 Mon Sep 17 00:00:00 2001 From: hehehe-li Date: Mon, 11 Aug 2025 21:46:23 +0800 Subject: [PATCH] reduce the scope of the lock Signed-off-by: hehehe-li --- .../ets/ani/privacy/src/privacy_manager.cpp | 42 +++--- .../src/permission/short_grant_manager.cpp | 52 +++---- .../permission/temp_permission_observer.cpp | 11 +- .../src/seccomp/sec_comp_enhance_agent.cpp | 10 +- .../main/cpp/src/seccomp/sec_comp_monitor.cpp | 3 +- .../src/record/permission_record_manager.cpp | 130 ++++++++++-------- .../include/remote/remote_command_manager.h | 2 +- .../include/remote/soft_bus_channel.h | 8 +- .../src/remote/remote_command_executor.cpp | 3 +- .../src/remote/remote_command_manager.cpp | 11 +- .../src/remote/soft_bus_channel.cpp | 22 ++- 11 files changed, 158 insertions(+), 136 deletions(-) diff --git a/frameworks/ets/ani/privacy/src/privacy_manager.cpp b/frameworks/ets/ani/privacy/src/privacy_manager.cpp index 008a93be6..0fb45eae2 100644 --- a/frameworks/ets/ani/privacy/src/privacy_manager.cpp +++ b/frameworks/ets/ani/privacy/src/privacy_manager.cpp @@ -367,30 +367,34 @@ static bool FindAndGetSubscriber(const RegisterPermActiveChangeContext* context, std::vector& batchPermActiveChangeSubscribers) { std::vector targetPermList = context->permissionList; - std::lock_guard lock(g_mutex); + bool callbackEqual; ani_ref callbackRef = context->callbackRef; bool isUndef = AniIsRefUndefined(context->env, context->callbackRef); - for (const auto& item : g_subScribers) { - std::vector permList; - item->subscriber->GetPermList(permList); - // targetCallback == nullptr, Unsubscribe from all callbacks under the same permList - // targetCallback != nullptr, unregister the subscriber with same permList and callback - if (isUndef) { - // batch delete currentThread callback - LOGI(PRI_DOMAIN, PRI_TAG, "Callback is null."); - callbackEqual = IsCurrentThread(item->threadId); - } else { - LOGI(PRI_DOMAIN, PRI_TAG, "Compare callback."); - if (!AniIsCallbackRefEqual(context->env, item->callbackRef, callbackRef, item->threadId, callbackEqual)) { - continue; + // DataRaceAndLock_009 + std::lock_guard lock(g_mutex); + { + for (const auto& item : g_subScribers) { + std::vector permList; + item->subscriber->GetPermList(permList); + // targetCallback == nullptr, Unsubscribe from all callbacks under the same permList + // targetCallback != nullptr, unregister the subscriber with same permList and callback + if (isUndef) { + // batch delete currentThread callback + LOGI(PRI_DOMAIN, PRI_TAG, "Callback is null."); + callbackEqual = IsCurrentThread(item->threadId); + } else { + LOGI(PRI_DOMAIN, PRI_TAG, "Compare callback."); + if (!AniIsCallbackRefEqual(context->env, item->callbackRef, callbackRef, item->threadId, callbackEqual)) { + continue; + } } - } - if (callbackEqual && (permList == targetPermList)) { - batchPermActiveChangeSubscribers.emplace_back(item); - if (!isUndef) { - return true; + if (callbackEqual && (permList == targetPermList)) { + batchPermActiveChangeSubscribers.emplace_back(item); + if (!isUndef) { + return true; + } } } } diff --git a/services/accesstokenmanager/main/cpp/src/permission/short_grant_manager.cpp b/services/accesstokenmanager/main/cpp/src/permission/short_grant_manager.cpp index a3b23b5ef..8f85404ea 100644 --- a/services/accesstokenmanager/main/cpp/src/permission/short_grant_manager.cpp +++ b/services/accesstokenmanager/main/cpp/src/permission/short_grant_manager.cpp @@ -136,33 +136,35 @@ int ShortGrantManager::RefreshPermission(AccessTokenID tokenID, const std::strin return AccessTokenError::ERR_PARAM_INVALID; } std::string taskName = TASK_NAME_SHORT_GRANT_PERMISSION + std::to_string(tokenID) + permission; - std::unique_lock lck(shortGrantDataMutex_); - - auto iter = std::find_if( - shortGrantData_.begin(), shortGrantData_.end(), [tokenID, permission](const PermTimerData& data) { - return data.tokenID == tokenID && data.permissionName == permission; - }); + // DataRaceAndLock_009 + { + std::unique_lock lck(shortGrantDataMutex_); + auto iter = std::find_if( + shortGrantData_.begin(), shortGrantData_.end(), [tokenID, permission](const PermTimerData& data) { + return data.tokenID == tokenID && data.permissionName == permission; + }); - if (iter == shortGrantData_.end()) { - auto iterator = std::find(g_shortGrantPermission.begin(), g_shortGrantPermission.end(), permission); - if (iterator == g_shortGrantPermission.end()) { - LOGE(ATM_DOMAIN, ATM_TAG, "Permission is not available to short grant: %{public}s!", permission.c_str()); - return AccessTokenError::ERR_PARAM_INVALID; - } - PermTimerData data; - data.tokenID = tokenID; - data.permissionName = permission; - data.firstGrantTimes = GetCurrentTime(); - data.revokeTimes = data.firstGrantTimes + onceTime; - int32_t ret = PermissionManager::GetInstance().GrantPermission(tokenID, permission, PERMISSION_USER_FIXED); - if (ret != RET_SUCCESS) { - LOGE(ATM_DOMAIN, ATM_TAG, "GrantPermission failed result %{public}d", ret); - return ret; + if (iter == shortGrantData_.end()) { + auto iterator = std::find(g_shortGrantPermission.begin(), g_shortGrantPermission.end(), permission); + if (iterator == g_shortGrantPermission.end()) { + LOGE(ATM_DOMAIN, ATM_TAG, "Permission is not available to short grant: %{public}s!", permission.c_str()); + return AccessTokenError::ERR_PARAM_INVALID; + } + PermTimerData data; + data.tokenID = tokenID; + data.permissionName = permission; + data.firstGrantTimes = GetCurrentTime(); + data.revokeTimes = data.firstGrantTimes + onceTime; + int32_t ret = PermissionManager::GetInstance().GrantPermission(tokenID, permission, PERMISSION_USER_FIXED); + if (ret != RET_SUCCESS) { + LOGE(ATM_DOMAIN, ATM_TAG, "GrantPermission failed result %{public}d", ret); + return ret; + } + shortGrantData_.emplace_back(data); + ShortGrantManager::GetInstance().ScheduleRevokeTask(tokenID, permission, taskName, onceTime); + RegisterAppStopListener(); + return RET_SUCCESS; } - shortGrantData_.emplace_back(data); - ShortGrantManager::GetInstance().ScheduleRevokeTask(tokenID, permission, taskName, onceTime); - RegisterAppStopListener(); - return RET_SUCCESS; } uint32_t maxRemainedTime = maxTime_ > (GetCurrentTime() - iter->firstGrantTimes) ? diff --git a/services/accesstokenmanager/main/cpp/src/permission/temp_permission_observer.cpp b/services/accesstokenmanager/main/cpp/src/permission/temp_permission_observer.cpp index 7aa3a2141..e9510fee4 100644 --- a/services/accesstokenmanager/main/cpp/src/permission/temp_permission_observer.cpp +++ b/services/accesstokenmanager/main/cpp/src/permission/temp_permission_observer.cpp @@ -537,10 +537,13 @@ void TempPermissionObserver::RevokeAllTempPermission(AccessTokenID tokenID) LOGE(ATM_DOMAIN, ATM_TAG, "TokenID:%{public}d not exist in permList", tokenID); return; } - std::unique_lock lck(tempPermissionMutex_); - tempPermTokenMap_.erase(tokenID); - if (tempPermTokenMap_.empty()) { - UnRegisterCallback(); + // DataRaceAndLock_009 + { + std::unique_lock lck(tempPermissionMutex_); + tempPermTokenMap_.erase(tokenID); + if (tempPermTokenMap_.empty()) { + UnRegisterCallback(); + } } std::vector tmpList; diff --git a/services/accesstokenmanager/main/cpp/src/seccomp/sec_comp_enhance_agent.cpp b/services/accesstokenmanager/main/cpp/src/seccomp/sec_comp_enhance_agent.cpp index 91de87f92..b02032671 100644 --- a/services/accesstokenmanager/main/cpp/src/seccomp/sec_comp_enhance_agent.cpp +++ b/services/accesstokenmanager/main/cpp/src/seccomp/sec_comp_enhance_agent.cpp @@ -42,7 +42,7 @@ SecCompEnhanceAgent& SecCompEnhanceAgent::GetInstance() return *instance; } -void SecCompEnhanceAgent::InitAppObserver() +void SecCompEnhanceAgent::InitAppObserverWithLock() { if (observer_ != nullptr) { return; @@ -65,7 +65,7 @@ void SecCompEnhanceAgent::InitAppObserver() SecCompEnhanceAgent::SecCompEnhanceAgent() { - InitAppObserver(); + InitAppObserverWithLock(); } SecCompEnhanceAgent::~SecCompEnhanceAgent() @@ -101,7 +101,7 @@ void SecCompEnhanceAgent::RemoveSecCompEnhance(int pid) int32_t SecCompEnhanceAgent::RegisterSecCompEnhance(const SecCompEnhanceData& enhanceData) { std::lock_guard lock(secCompEnhanceMutex_); - InitAppObserver(); + InitAppObserverWithLock(); int pid = IPCSkeleton::GetCallingPid(); if (std::any_of(secCompEnhanceData_.begin(), secCompEnhanceData_.end(), [pid](const auto& e) { return e.pid == pid; })) { @@ -127,7 +127,7 @@ int32_t SecCompEnhanceAgent::RegisterSecCompEnhance(const SecCompEnhanceData& en int32_t SecCompEnhanceAgent::UpdateSecCompEnhance(int32_t pid, uint32_t seqNum) { std::lock_guard lock(secCompEnhanceMutex_); - InitAppObserver(); + InitAppObserverWithLock(); for (auto iter = secCompEnhanceData_.begin(); iter != secCompEnhanceData_.end(); ++iter) { if (iter->pid == pid) { iter->seqNum = seqNum; @@ -141,7 +141,7 @@ int32_t SecCompEnhanceAgent::UpdateSecCompEnhance(int32_t pid, uint32_t seqNum) int32_t SecCompEnhanceAgent::GetSecCompEnhance(int32_t pid, SecCompEnhanceData& enhanceData) { std::lock_guard lock(secCompEnhanceMutex_); - InitAppObserver(); + InitAppObserverWithLock(); for (auto iter = secCompEnhanceData_.begin(); iter != secCompEnhanceData_.end(); ++iter) { if (iter->pid == pid) { enhanceData = *iter; diff --git a/services/accesstokenmanager/main/cpp/src/seccomp/sec_comp_monitor.cpp b/services/accesstokenmanager/main/cpp/src/seccomp/sec_comp_monitor.cpp index 2812f2d7e..c6c0fba70 100644 --- a/services/accesstokenmanager/main/cpp/src/seccomp/sec_comp_monitor.cpp +++ b/services/accesstokenmanager/main/cpp/src/seccomp/sec_comp_monitor.cpp @@ -74,8 +74,9 @@ void SecCompAppManagerDeathCallback::NotifyAppManagerDeath() bool SecCompMonitor::IsToastShownNeeded(int32_t pid) { - std::lock_guard lock(appfgLock_); InitAppObserver(); + // DataRaceAncLock_009 + std::lock_guard lock(appfgLock_); auto iter = appsInForeground_.find(pid); if (iter != appsInForeground_.end()) { return false; diff --git a/services/privacymanager/src/record/permission_record_manager.cpp b/services/privacymanager/src/record/permission_record_manager.cpp index 974ae69ff..2fb3906a5 100644 --- a/services/privacymanager/src/record/permission_record_manager.cpp +++ b/services/privacymanager/src/record/permission_record_manager.cpp @@ -990,41 +990,44 @@ int32_t PermissionRecordManager::AddRecordToStartList( void PermissionRecordManager::ExecuteAndUpdateRecord(uint32_t tokenId, int32_t pid, ActiveChangeType status) { std::vector camPermList; - std::lock_guard lock(startRecordListMutex_); - std::set updateList; - for (auto it = startRecordList_.begin(); it != startRecordList_.end();) { - if ((it->tokenId == tokenId) && // tokenId - ((it->pid == -1) || (it->pid == pid)) && // pid - ((it->status != PERM_INACTIVE) && (it->status != status))) { // status - std::string perm; - Constant::TransferOpcodeToPermission(it->opCode, perm); - if ((GetMuteStatus(perm, EDM)) || (!GetGlobalSwitchStatus(perm))) { - ++it; - continue; - } + // DataRaceAncLock_009 + { + std::lock_guard lock(startRecordListMutex_); + std::set updateList; + for (auto it = startRecordList_.begin(); it != startRecordList_.end();) { + if ((it->tokenId == tokenId) && // tokenId + ((it->pid == -1) || (it->pid == pid)) && // pid + ((it->status != PERM_INACTIVE) && (it->status != status))) { // status + std::string perm; + Constant::TransferOpcodeToPermission(it->opCode, perm); + if ((GetMuteStatus(perm, EDM)) || (!GetGlobalSwitchStatus(perm))) { + ++it; + continue; + } #ifdef CAMERA_FLOAT_WINDOW_ENABLE - if ((perm == CAMERA_PERMISSION_NAME) && (status == PERM_ACTIVE_IN_BACKGROUND)) { - LOGI(PRI_DOMAIN, PRI_TAG, "Camera float window is close!"); - camPermList.emplace_back(perm); - ++it; - continue; - } + if ((perm == CAMERA_PERMISSION_NAME) && (status == PERM_ACTIVE_IN_BACKGROUND)) { + LOGI(PRI_DOMAIN, PRI_TAG, "Camera float window is close!"); + camPermList.emplace_back(perm); + ++it; + continue; + } #endif - // update status to input and timestamp to now in cache - auto record = *it; - record.status = status; - updateList.emplace(record); - it = startRecordList_.erase(it); - LOGD(PRI_DOMAIN, PRI_TAG, "TokenId %{public}d pid %{public}d get permission %{public}s.", tokenId, pid, - perm.c_str()); - continue; + // update status to input and timestamp to now in cache + auto record = *it; + record.status = status; + updateList.emplace(record); + it = startRecordList_.erase(it); + LOGD(PRI_DOMAIN, PRI_TAG, "TokenId %{public}d pid %{public}d get permission %{public}s.", tokenId, pid, + perm.c_str()); + continue; + } + ++it; } - ++it; + startRecordList_.insert(updateList.begin(), updateList.end()); } - startRecordList_.insert(updateList.begin(), updateList.end()); if (!camPermList.empty()) { ExecuteCameraCallbackAsync(tokenId, pid); @@ -1218,25 +1221,28 @@ void PermissionRecordManager::ExecuteAndUpdateRecordByPerm(const std::string& pe int32_t opCode; Constant::TransferPermissionToOpcode(permissionName, opCode); std::set updatedRecordList; - std::lock_guard lock(startRecordListMutex_); - for (auto it = startRecordList_.begin(); it != startRecordList_.end();) { - ContinusPermissionRecord record = *it; - if ((record.opCode) != static_cast(opCode)) { - ++it; - continue; - } - if (switchStatus) { - LOGI(PRI_DOMAIN, PRI_TAG, "Global switch is open, update record from inactive"); - // no need to store in database when status from inactive to foreground or background - record.status = GetAppStatus(record.tokenId); - } else { - LOGI(PRI_DOMAIN, PRI_TAG, "Global switch is close, update record to inactive"); - record.status = PERM_INACTIVE; + { + // DataRaceAndLock_009 + std::lock_guard lock(startRecordListMutex_); + for (auto it = startRecordList_.begin(); it != startRecordList_.end();) { + ContinusPermissionRecord record = *it; + if ((record.opCode) != static_cast(opCode)) { + ++it; + continue; + } + if (switchStatus) { + LOGI(PRI_DOMAIN, PRI_TAG, "Global switch is open, update record from inactive"); + // no need to store in database when status from inactive to foreground or background + record.status = GetAppStatus(record.tokenId); + } else { + LOGI(PRI_DOMAIN, PRI_TAG, "Global switch is close, update record to inactive"); + record.status = PERM_INACTIVE; + } + updatedRecordList.emplace(record); + it = startRecordList_.erase(it); } - updatedRecordList.emplace(record); - it = startRecordList_.erase(it); + startRecordList_.insert(updatedRecordList.begin(), updatedRecordList.end()); } - startRecordList_.insert(updatedRecordList.begin(), updatedRecordList.end()); // each permission sends a status change notice for (const auto& record : updatedRecordList) { CallbackExecute(record, permissionName); @@ -1261,16 +1267,20 @@ bool PermissionRecordManager::ShowGlobalDialog(const std::string& permissionName .resource = resource }; - std::lock_guard lock(abilityManagerMutex_); - if (abilityManagerLoader_ == nullptr) { - abilityManagerLoader_ = std::make_shared(ABILITY_MANAGER_LIBPATH); - } + // DataRaceAndLock_009 + AbilityManagerAccessLoaderInterface* abilityManager = nullptr; + { + std::lock_guard lock(abilityManagerMutex_); + if (abilityManagerLoader_ == nullptr) { + abilityManagerLoader_ = std::make_shared(ABILITY_MANAGER_LIBPATH); + } - AbilityManagerAccessLoaderInterface* abilityManager = - abilityManagerLoader_->GetObject(); - if (abilityManager == nullptr) { - LOGE(PRI_DOMAIN, PRI_TAG, "AbilityManager is nullptr!"); - return false; + abilityManager = + abilityManagerLoader_->GetObject(); + if (abilityManager == nullptr) { + LOGE(PRI_DOMAIN, PRI_TAG, "AbilityManager is nullptr!"); + return false; + } } ErrCode err = abilityManager->StartAbility(innerWant, nullptr); if (err != ERR_OK) { @@ -1482,12 +1492,16 @@ bool PermissionRecordManager::IsAllowedUsingMicrophone(AccessTokenID tokenId, in return true; } - std::lock_guard lock(foreReminderMutex_); - auto iter = std::find(foreTokenIdList_.begin(), foreTokenIdList_.end(), tokenId); - if (iter != foreTokenIdList_.end()) { - return true; + // DataRaceAndLock_009 + { + std::lock_guard lock(foreReminderMutex_); + auto iter = std::find(foreTokenIdList_.begin(), foreTokenIdList_.end(), tokenId); + if (iter != foreTokenIdList_.end()) { + return true; + } } + return (AccessTokenKit::VerifyAccessToken(tokenId, "ohos.permission.MICROPHONE_BACKGROUND") == PERMISSION_GRANTED); } diff --git a/services/tokensyncmanager/include/remote/remote_command_manager.h b/services/tokensyncmanager/include/remote/remote_command_manager.h index 6cad1db00..38ce1eefe 100644 --- a/services/tokensyncmanager/include/remote/remote_command_manager.h +++ b/services/tokensyncmanager/include/remote/remote_command_manager.h @@ -110,7 +110,7 @@ public: * * @param udid The udid of a device which you want to remove. */ - void RemoveCommand(const std::string &udid); + void RemoveCommandWithLock(const std::string &udid); /** * @brief For event of device online, prepare channel and build connection with peer device. diff --git a/services/tokensyncmanager/include/remote/soft_bus_channel.h b/services/tokensyncmanager/include/remote/soft_bus_channel.h index f5b767565..6e5c2cb62 100644 --- a/services/tokensyncmanager/include/remote/soft_bus_channel.h +++ b/services/tokensyncmanager/include/remote/soft_bus_channel.h @@ -282,7 +282,7 @@ private: std::mutex mutex_; // connection closing state. true: in closing, false: otherwise - bool isDelayClosing_; + bool isDelayClosing_ = false; // soft bus socket mutex std::mutex socketMutex_; @@ -291,15 +291,17 @@ private: int socketFd_; // soft bus socket busy flag, true: busy, false: otherwise - bool isSocketUsing_; + std::atomic isSocketUsing_{false}; // communication callbacks map. key: unique message id, value: response callback. std::map> callbacks_; // callback function arguments: response string variable - std::string responseResult_; + std::string responseResult_ = ""; // callback function execute variable std::condition_variable loadedCond_; + // callback mutex + std::mutex callbackMutex_; }; class SoftBusMessage { diff --git a/services/tokensyncmanager/src/remote/remote_command_executor.cpp b/services/tokensyncmanager/src/remote/remote_command_executor.cpp index 15a10352f..f218ee730 100644 --- a/services/tokensyncmanager/src/remote/remote_command_executor.cpp +++ b/services/tokensyncmanager/src/remote/remote_command_executor.cpp @@ -195,7 +195,7 @@ int RemoteCommandExecutor::ProcessBufferedCommands(bool standalone) void RemoteCommandExecutor::ProcessBufferedCommandsWithThread() { LOGI(ATM_DOMAIN, ATM_TAG, "Begin, targetNodeId: %{public}s", ConstantCommon::EncryptDevId(targetNodeId_).c_str()); - + // 过大?只锁commands_ std::unique_lock lock(mutex_); if (commands_.empty()) { @@ -306,6 +306,7 @@ int RemoteCommandExecutor::ExecuteRemoteCommand( void RemoteCommandExecutor::CreateChannelIfNeeded() { + // 没看懂锁的是什么 std::unique_lock lock(mutex_); if (ptrChannel_ != nullptr) { LOGI(ATM_DOMAIN, ATM_TAG, "TargetNodeId %{public}s, channel is exist.", diff --git a/services/tokensyncmanager/src/remote/remote_command_manager.cpp b/services/tokensyncmanager/src/remote/remote_command_manager.cpp index c50dbfc9e..44c003b9e 100644 --- a/services/tokensyncmanager/src/remote/remote_command_manager.cpp +++ b/services/tokensyncmanager/src/remote/remote_command_manager.cpp @@ -77,7 +77,7 @@ int RemoteCommandManager::AddCommand(const std::string &udid, const std::shared_ return result; } -void RemoteCommandManager::RemoveCommand(const std::string &udid) +void RemoteCommandManager::RemoveCommandWithLock(const std::string &udid) { LOGI(ATM_DOMAIN, ATM_TAG, "Remove command"); executors_.erase(udid); @@ -188,8 +188,6 @@ int RemoteCommandManager::NotifyDeviceOnline(const std::string &nodeId) executor->SetChannel(channel); } - lock.unlock(); - return Constant::SUCCESS; } @@ -210,9 +208,10 @@ int RemoteCommandManager::NotifyDeviceOffline(const std::string &nodeId) channel->Release(); } - std::unique_lock lock(mutex_); - RemoveCommand(nodeId); - lock.unlock(); + { + std::unique_lock lock(mutex_); + RemoveCommandWithLock(nodeId); + } DeviceInfo devInfo; bool result = DeviceInfoManager::GetInstance().GetDeviceInfo(nodeId, DeviceIdType::UNKNOWN, devInfo); diff --git a/services/tokensyncmanager/src/remote/soft_bus_channel.cpp b/services/tokensyncmanager/src/remote/soft_bus_channel.cpp index b1e0cda89..507461cd3 100644 --- a/services/tokensyncmanager/src/remote/soft_bus_channel.cpp +++ b/services/tokensyncmanager/src/remote/soft_bus_channel.cpp @@ -40,12 +40,9 @@ static const int RPC_TRANSFER_HEAD_BYTES_LENGTH = 1024 * 256; static const int RPC_TRANSFER_BYTES_MAX_LENGTH = 1024 * 1024; } // namespace SoftBusChannel::SoftBusChannel(const std::string &deviceId) - : deviceId_(deviceId), mutex_(), callbacks_(), responseResult_(""), loadedCond_() + : deviceId_(deviceId), socketFd_(Constant::INVALID_SOCKET_FD) { LOGD(ATM_DOMAIN, ATM_TAG, "SoftBusChannel(deviceId)"); - isDelayClosing_ = false; - socketFd_ = Constant::INVALID_SOCKET_FD; - isSocketUsing_ = false; } SoftBusChannel::~SoftBusChannel() @@ -117,7 +114,7 @@ void SoftBusChannel::CloseConnection() return; } std::unique_lock lock(self->socketMutex_); - if (self->isSocketUsing_) { + if (self->isSocketUsing_.load()) { LOGD(ATM_DOMAIN, ATM_TAG, "Socket is in using, cancel close socket"); } else { SoftBusManager::GetInstance().CloseSocket(self->socketFd_); @@ -162,7 +159,7 @@ std::string SoftBusChannel::GetUuid() void SoftBusChannel::InsertCallback(int result, std::string &uuid) { - std::unique_lock lock(socketMutex_); + std::unique_lock lock(callbackMutex_); std::function callback = [this](const std::string &result) { responseResult_ = std::string(result); loadedCond_.notify_all(); @@ -170,8 +167,7 @@ void SoftBusChannel::InsertCallback(int result, std::string &uuid) }; callbacks_.insert(std::pair>(uuid, callback)); - isSocketUsing_ = true; - lock.unlock(); + isSocketUsing_.store(true); } std::string SoftBusChannel::ExecuteCommand(const std::string &commandName, const std::string &jsonPayload) @@ -202,11 +198,11 @@ std::string SoftBusChannel::ExecuteCommand(const std::string &commandName, const int retCode = SendRequestBytes(buf, info.bytesLength); delete[] buf; - std::unique_lock lock2(socketMutex_); + std::unique_lock lock2(callbackMutex_); if (retCode != Constant::SUCCESS) { LOGE(ATM_DOMAIN, ATM_TAG, "Send request data failed: %{public}d ", retCode); callbacks_.erase(uuid); - isSocketUsing_ = false; + isSocketUsing_.store(false); return ""; } @@ -214,11 +210,11 @@ std::string SoftBusChannel::ExecuteCommand(const std::string &commandName, const if (loadedCond_.wait_for(lock2, std::chrono::milliseconds(EXECUTE_COMMAND_TIME_OUT)) == std::cv_status::timeout) { LOGW(ATM_DOMAIN, ATM_TAG, "Time out to wait response."); callbacks_.erase(uuid); - isSocketUsing_ = false; + isSocketUsing_.store(false); return ""; } - isSocketUsing_ = false; + isSocketUsing_.store(false); return responseResult_; } @@ -445,7 +441,7 @@ void SoftBusChannel::HandleRequest(int socket, const std::string &id, const std: void SoftBusChannel::HandleResponse(const std::string &id, const std::string &jsonPayload) { - std::unique_lock lock(socketMutex_); + std::unique_lock lock(callbackMutex_); auto callback = callbacks_.find(id); if (callback != callbacks_.end()) { (callback->second)(jsonPayload); -- Gitee