diff --git a/adapter/uhdf2/ipc/include/hdf_remote_adapter.h b/adapter/uhdf2/ipc/include/hdf_remote_adapter.h index 9dbc817fd0a40c8decf1b32c3cd6553f99e5317f..ad8ffa7ad30ec34fdb2ef0891a91608b1a27f504 100644 --- a/adapter/uhdf2/ipc/include/hdf_remote_adapter.h +++ b/adapter/uhdf2/ipc/include/hdf_remote_adapter.h @@ -22,6 +22,7 @@ #include "hdf_remote_adapter_if.h" #include "hdf_remote_service.h" +#include #ifdef __cplusplus extern "C" { @@ -34,8 +35,10 @@ public: OHOS::MessageParcel &data, OHOS::MessageParcel &reply, OHOS::MessageOption &option) override; ~HdfRemoteServiceStub(); int32_t Dump(int32_t fd, const std::vector &args) override; + void HdfRemoteStubClearHolder(); private: struct HdfRemoteService *service_; + std::shared_mutex mutex_; }; class HdfDeathNotifier : public OHOS::IRemoteObject::DeathRecipient { diff --git a/adapter/uhdf2/ipc/src/hdf_remote_adapter.cpp b/adapter/uhdf2/ipc/src/hdf_remote_adapter.cpp index 5b47f5303b5d105d9103a8bf0d58bc76b24125be..984af37b2611d256509d94d48a90500fc3e785e6 100644 --- a/adapter/uhdf2/ipc/src/hdf_remote_adapter.cpp +++ b/adapter/uhdf2/ipc/src/hdf_remote_adapter.cpp @@ -42,15 +42,16 @@ int HdfRemoteServiceStub::OnRemoteRequest(uint32_t code, { HDF_LOGD("OnRemoteRequest enter"); (void)option; - if (service_ == nullptr) { - HDF_LOGE("service_ is nullptr"); - return HDF_ERR_INVALID_OBJECT; - } int ret = HDF_FAILURE; struct HdfSBuf *dataSbuf = ParcelToSbuf(&data); struct HdfSBuf *replySbuf = ParcelToSbuf(&reply); + std::shared_lock lock(mutex_); + if (service_ == nullptr) { + HDF_LOGE("service_ is nullptr"); + return HDF_ERR_INVALID_OBJECT; + } struct HdfRemoteDispatcher *dispatcher = service_->dispatcher; if (dispatcher != nullptr && dispatcher->Dispatch != nullptr) { ret = dispatcher->Dispatch(reinterpret_cast(service_->target), code, dataSbuf, replySbuf); @@ -63,6 +64,12 @@ int HdfRemoteServiceStub::OnRemoteRequest(uint32_t code, return ret; } +void HdfRemoteServiceStub::HdfRemoteStubClearHolder() +{ + std::unique_lock lock(mutex_); + service_ = nullptr; +} + HdfRemoteServiceStub::~HdfRemoteServiceStub() { HDF_LOGD("~HdfRemoteServiceStub"); @@ -230,6 +237,13 @@ void HdfRemoteAdapterRecycle(struct HdfRemoteService *object) { struct HdfRemoteServiceHolder *holder = reinterpret_cast(object); if (holder != nullptr) { + auto remote = holder->remote_; + if (remote != nullptr && !remote->IsProxyObject()) { + HdfRemoteServiceStub *stub = reinterpret_cast(remote.GetRefPtr()); + if (stub != nullptr) { + stub->HdfRemoteStubClearHolder(); + } + } holder->service_.target = nullptr; holder->service_.dispatcher = nullptr; holder->descriptor_.clear();