diff --git a/adapter/uhdf2/host/BUILD.gn b/adapter/uhdf2/host/BUILD.gn index 08214046127d4abc44c183d272a5355bc14616be..859bd4fd5607c2d0775eebb959e5611f04ec85a9 100644 --- a/adapter/uhdf2/host/BUILD.gn +++ b/adapter/uhdf2/host/BUILD.gn @@ -34,8 +34,10 @@ if (defined(ohos_lite)) { } } else { ohos_shared_library("libhdf_host") { + defines = [ "__USER__" ] + if (target_cpu == "arm64" || target_cpu == "x86_64") { - defines = [ "__ARCH64__" ] + defines += [ "__ARCH64__" ] } public_configs = [ ":libhdf_host_public_config" ] diff --git a/adapter/uhdf2/host/src/device_service_stub.c b/adapter/uhdf2/host/src/device_service_stub.c index 55ac66fbcee6931632d77b076137a5f7dd1170b3..51419c6601169e6ec594f81b345c81cce0d3e4fa 100644 --- a/adapter/uhdf2/host/src/device_service_stub.c +++ b/adapter/uhdf2/host/src/device_service_stub.c @@ -19,6 +19,9 @@ #include "hdf_log.h" #include "hdf_sbuf.h" #include "osal_mem.h" +#ifdef __USER__ +#include +#endif int DeviceServiceStubDispatch( struct HdfRemoteService *stub, int code, struct HdfSBuf *data, struct HdfSBuf *reply) @@ -27,7 +30,14 @@ int DeviceServiceStubDispatch( struct IDeviceIoService *ioService = service->super.deviceObject.service; int ret = HDF_FAILURE; +#ifdef __USER__ + pthread_rwlock_rdlock(&service->super.deviceObject.mutex); +#endif + if (ioService == NULL) { +#ifdef __USER__ + pthread_rwlock_unlock(&service->super.deviceObject.mutex); +#endif return HDF_FAILURE; } @@ -39,6 +49,10 @@ int DeviceServiceStubDispatch( if (ioService->Dispatch != NULL) { ret = ioService->Dispatch(&client, code, data, reply); } + +#ifdef __USER__ + pthread_rwlock_unlock(&service->super.deviceObject.mutex); +#endif return ret; } diff --git a/framework/core/host/src/hdf_device_node.c b/framework/core/host/src/hdf_device_node.c index 6475b09911548adada22a00f0b9fc05fa599d9b5..063645e4b3df4baa7ac78018017ebb3083c2c326 100644 --- a/framework/core/host/src/hdf_device_node.c +++ b/framework/core/host/src/hdf_device_node.c @@ -20,6 +20,9 @@ #include "hdf_log.h" #include "hdf_object_manager.h" #include "osal_mem.h" +#ifdef __USER__ +#include +#endif #include "power_state_token.h" #define HDF_LOG_TAG device_node @@ -186,7 +189,16 @@ static void HdfDeviceUnlaunchNode(struct HdfDeviceNode *devNode) } if (driverEntry != NULL && driverEntry->Release != NULL) { +#ifdef __USER__ + pthread_rwlock_wrlock(&devNode->deviceObject.mutex); +#endif + driverEntry->Release(&devNode->deviceObject); + +#ifdef __USER__ + devNode->deviceObject.service = NULL; + pthread_rwlock_unlock(&devNode->deviceObject.mutex); +#endif } if (devNode->servStatus) { diff --git a/framework/core/host/src/hdf_device_object.c b/framework/core/host/src/hdf_device_object.c index fed79048e1939dbf24ebb5e2fd9ea6b9e6403a29..9f994454d0e9951c3b6f188b953b1142c6e58146 100644 --- a/framework/core/host/src/hdf_device_object.c +++ b/framework/core/host/src/hdf_device_object.c @@ -18,6 +18,9 @@ #include "hdf_power_manager.h" #include "hdf_service_observer.h" #include "osal_mem.h" +#ifdef __USER__ +#include +#endif #include "power_state_token.h" #define HDF_LOG_TAG device_object @@ -168,6 +171,9 @@ bool HdfDeviceSetClass(struct HdfDeviceObject *deviceObject, DeviceClass deviceC void HdfDeviceObjectConstruct(struct HdfDeviceObject *deviceObject) { if (deviceObject != NULL) { +#ifdef __USER__ + pthread_rwlock_init(&deviceObject->mutex, NULL); +#endif #ifdef LOSCFG_DRIVERS_HDF_CONFIG_MACRO deviceObject->deviceMatchAttr = NULL; #else diff --git a/interfaces/inner_api/host/shared/hdf_device_desc.h b/interfaces/inner_api/host/shared/hdf_device_desc.h index 8a924a1fb27e5644aacd00cfeab2848582b662d8..6dc8c3ad3453d54e65561ded0f7b35153a5e0a29 100644 --- a/interfaces/inner_api/host/shared/hdf_device_desc.h +++ b/interfaces/inner_api/host/shared/hdf_device_desc.h @@ -33,6 +33,9 @@ #include "hdf_io_service_if.h" #include "hdf_object.h" #include "hdf_sbuf.h" +#ifdef __USER__ +#include +#endif #ifdef __cplusplus extern "C" { @@ -102,6 +105,11 @@ struct HdfDeviceObject { DeviceClass deviceClass; /** Pointer to the private data of the device */ void *priv; + +#ifdef __USER__ + /** lock for service, guarantee the service is valid in HDF */ + pthread_rwlock_t mutex; +#endif }; /**