diff --git a/interfaces/inner_api/file_access/include/file_access_ext_connection.h b/interfaces/inner_api/file_access/include/file_access_ext_connection.h index 83801fe7a2ce11d632c0409c5d11b435471249ea..ee18f6aa7ba74ea4bbf74d44ebc5c4415b831d85 100644 --- a/interfaces/inner_api/file_access/include/file_access_ext_connection.h +++ b/interfaces/inner_api/file_access/include/file_access_ext_connection.h @@ -47,7 +47,6 @@ private: void RemoveFileAccessDeathRecipient(const sptr &token); struct ThreadLockInfo { std::condition_variable condition; - std::mutex mutex; bool isReady = false; }; ThreadLockInfo connectLockInfo_; @@ -56,6 +55,7 @@ private: std::atomic isConnected_ = {false}; sptr fileExtProxy_; std::mutex deathRecipientMutex_; + std::mutex proxyMutex_; sptr callerDeathRecipient_ = nullptr; }; diff --git a/interfaces/inner_api/file_access/src/file_access_ext_connection.cpp b/interfaces/inner_api/file_access/src/file_access_ext_connection.cpp index 3a6c782c3a01f47bb3626c584dfb36c422485007..be93711e10b38fbc74edd95fe3ff49b1d8f7ed4a 100644 --- a/interfaces/inner_api/file_access/src/file_access_ext_connection.cpp +++ b/interfaces/inner_api/file_access/src/file_access_ext_connection.cpp @@ -31,6 +31,7 @@ std::mutex FileAccessExtConnection::mutex_; void FileAccessExtConnection::OnAbilityConnectDone( const AppExecFwk::ElementName &element, const sptr &remoteObject, int resultCode) { + std::lock_guard lock(proxyMutex_); if (remoteObject == nullptr) { HILOG_ERROR("remote is nullptr"); return; @@ -43,26 +44,32 @@ void FileAccessExtConnection::OnAbilityConnectDone( AddFileAccessDeathRecipient(fileExtProxy_->AsObject()); HILOG_INFO("OnAbilityConnectDone set connected info"); isConnected_.store(true); - std::lock_guard lock(connectLockInfo_.mutex); connectLockInfo_.isReady = true; connectLockInfo_.condition.notify_all(); } void FileAccessExtConnection::OnAbilityDisconnectDone(const AppExecFwk::ElementName &element, int resultCode) { + std::lock_guard lock(proxyMutex_); + if (fileExtProxy_) { + fileExtProxy_ = nullptr; + } + isConnected_.store(false); HILOG_INFO("OnAbilityDisconnectDone resultCode=%{public}d", resultCode); } void FileAccessExtConnection::ConnectFileExtAbility(const AAFwk::Want &want, const sptr &token) { - fileExtProxy_ = nullptr; + std::unique_lock lock(proxyMutex_); + if (fileExtProxy_) { + fileExtProxy_ = nullptr; + } isConnected_.store(false); ErrCode ret = AAFwk::AbilityManagerClient::GetInstance()->ConnectAbility(want, this, token); if (ret != ERR_OK) { HILOG_ERROR("ConnectAbility failed, ret=%{public}d", ret); return; } - std::unique_lock lock(connectLockInfo_.mutex); const int WAIT_TIME = 3; // second if (!connectLockInfo_.condition.wait_for(lock, std::chrono::seconds(WAIT_TIME), [this] { return fileExtProxy_ != nullptr && connectLockInfo_.isReady; })) { @@ -74,6 +81,7 @@ void FileAccessExtConnection::ConnectFileExtAbility(const AAFwk::Want &want, con void FileAccessExtConnection::DisconnectFileExtAbility() { + std::lock_guard lock(proxyMutex_); if (fileExtProxy_ != nullptr) { RemoveFileAccessDeathRecipient(fileExtProxy_->AsObject()); } @@ -82,7 +90,9 @@ void FileAccessExtConnection::DisconnectFileExtAbility() HILOG_ERROR("DisconnectAbility failed, ret=%{public}d", ret); return; } - fileExtProxy_ = nullptr; + if (fileExtProxy_) { + fileExtProxy_ = nullptr; + } isConnected_.store(false); HILOG_INFO("DisconnectFileExtAbility done"); } @@ -123,6 +133,7 @@ void FileAccessExtConnection::RemoveFileAccessDeathRecipient(const sptr &remote) { + std::lock_guard lock(proxyMutex_); HILOG_ERROR("OnSchedulerDied"); auto object = remote.promote(); if (object) {