diff --git a/interfaces/native/include/sensor_agent_type.h b/interfaces/native/include/sensor_agent_type.h index 85531a585d586719192e43621f5fc0bf4775ef02..78479e4ed9b30879d7be9ad09b16d55c54f5c61d 100644 --- a/interfaces/native/include/sensor_agent_type.h +++ b/interfaces/native/include/sensor_agent_type.h @@ -126,7 +126,7 @@ typedef struct SensorEvent { int64_t timestamp; /**< Time when sensor data was reported */ uint32_t option; /**< Sensor data options, including the measurement range and accuracy */ int32_t mode; /**< Sensor data reporting mode (described in {@link SensorMode}) */ - uint8_t *data; /**< Sensor data */ + uint8_t *data = nullptr; /**< Sensor data */ uint32_t dataLen; /**< Sensor data length */ } SensorEvent; @@ -154,7 +154,7 @@ typedef struct UserData { typedef struct SensorUser { char name[NAME_MAX_LEN]; /**< Name of the sensor data subscriber */ RecordSensorCallback callback; /**< Callback for reporting sensor data */ - UserData *userData; /**< Reserved field for the sensor data subscriber */ + UserData *userData = nullptr; /**< Reserved field for the sensor data subscriber */ } SensorUser; /** diff --git a/interfaces/plugin/include/async_callback_info.h b/interfaces/plugin/include/async_callback_info.h index 2d515f213513d9b470ce0ae31ae4a4c4ab3d56db..94b3512b98c28057bd03ecfb6ac32c717d5c5430 100644 --- a/interfaces/plugin/include/async_callback_info.h +++ b/interfaces/plugin/include/async_callback_info.h @@ -121,10 +121,6 @@ public: napi_delete_reference(env, callback[i]); } } - if (work != nullptr) { - delete work; - work = nullptr; - } } private: diff --git a/interfaces/plugin/src/sensor_napi_utils.cpp b/interfaces/plugin/src/sensor_napi_utils.cpp index 4cfecb6827b2522fc6282b6e9610e95323881325..f8d1cab8e48ef9e649c200dd229f5646311a2bcc 100644 --- a/interfaces/plugin/src/sensor_napi_utils.cpp +++ b/interfaces/plugin/src/sensor_napi_utils.cpp @@ -486,12 +486,12 @@ void EmitUvEventLoop(sptr asyncCallbackInfo) CHKPV(loop); uv_work_t *work = new(std::nothrow) uv_work_t; CHKPV(work); - asyncCallbackInfo->work = work; asyncCallbackInfo->IncStrongRef(nullptr); work->data = asyncCallbackInfo.GetRefPtr(); int32_t ret = uv_queue_work(loop, work, [] (uv_work_t *work) { }, [] (uv_work_t *work, int status) { CHKPV(work); sptr asyncCallbackInfo(static_cast(work->data)); + freeWork(work); /** * After the asynchronous task is created, the asyncCallbackInfo reference count is reduced * to 0 destructions, so you need to add 1 to the asyncCallbackInfo reference count when the @@ -530,13 +530,10 @@ void EmitUvEventLoop(sptr asyncCallbackInfo) return; } napi_close_handle_scope(asyncCallbackInfo->env, scope); - asyncCallbackInfo->work = nullptr; - freeWork(work); }); if (ret != 0) { SEN_HILOGE("uv_queue_work fail"); asyncCallbackInfo->DecStrongRef(nullptr); - asyncCallbackInfo->work = nullptr; freeWork(work); } } diff --git a/services/sensor/include/sensor_service.h b/services/sensor/include/sensor_service.h index a436cf89adc7c5377f994b9f4f67c6af91248997..62137d5bd8fc4c2314852c2fc6e6151d418c160c 100644 --- a/services/sensor/include/sensor_service.h +++ b/services/sensor/include/sensor_service.h @@ -78,11 +78,11 @@ private: ClientInfo &clientInfo_ = ClientInfo::GetInstance(); SensorManager &sensorManager_ = SensorManager::GetInstance(); FlushInfoRecord &flushInfo_ = FlushInfoRecord::GetInstance(); - sptr sensorDataProcesser_; - sptr reportDataCallback_; + sptr sensorDataProcesser_ = nullptr; + sptr reportDataCallback_ = nullptr; std::mutex uidLock_; // death recipient of sensor client - sptr clientDeathObserver_; + sptr clientDeathObserver_ = nullptr; ErrCode SaveSubscriber(uint32_t sensorId, int64_t samplingPeriodNs, int64_t maxReportDelayNs); }; } // namespace Sensors diff --git a/services/sensor/src/sensor_dump.cpp b/services/sensor/src/sensor_dump.cpp index d1d298b904f82bf1703aa9447056f37af4612768..5a1c8a0c877d264cc50727ae42c8598b23cbed90 100644 --- a/services/sensor/src/sensor_dump.cpp +++ b/services/sensor/src/sensor_dump.cpp @@ -173,6 +173,9 @@ void SensorDump::ParseCommand(int32_t fd, const std::vector &args, } RELEASE_RES: for (size_t i = 0; i < args.size(); ++i) { + if (argv[i] == nullptr) { + continue; + } delete[] argv[i]; } delete[] argv; diff --git a/utils/include/sensor_basic_data_channel.h b/utils/include/sensor_basic_data_channel.h index 30147e6b4e9b65b735133e82b319fcf24875371c..e982b92905a5f66c5616ec1e9b13726bd67bc695 100644 --- a/utils/include/sensor_basic_data_channel.h +++ b/utils/include/sensor_basic_data_channel.h @@ -42,13 +42,12 @@ public: virtual ~SensorBasicDataChannel(); int32_t CreateSensorBasicChannel(); int32_t CreateSensorBasicChannel(MessageParcel &data); - int32_t DestroySensorBasicChannel(); + void DestroySensorBasicChannel(); int32_t GetSendDataFd() const; int32_t GetReceiveDataFd() const; int32_t SendToBinder(MessageParcel &data); void CloseSendFd(); int32_t SendData(const void *vaddr, size_t size); - int32_t ReceiveData(void *vaddr, size_t size); bool GetSensorStatus() const; void SetSensorStatus(bool isActive); const std::unordered_map &GetDataCacheBuf() const; diff --git a/utils/src/sensor_basic_data_channel.cpp b/utils/src/sensor_basic_data_channel.cpp index 0e7ef0777eaf5c1609e4b19e50d3a17995c80444..8a951cafdb696f8fd2251c1f3b35da211ba18d5a 100755 --- a/utils/src/sensor_basic_data_channel.cpp +++ b/utils/src/sensor_basic_data_channel.cpp @@ -31,6 +31,7 @@ constexpr HiLogLabel LABEL = { LOG_CORE, SENSOR_LOG_DOMAIN, "SensorBasicChannel" constexpr int32_t SENSOR_READ_DATA_SIZE = sizeof(SensorEvent) * 100; constexpr int32_t DEFAULT_CHANNEL_SIZE = 2 * 1024; constexpr int32_t SOCKET_PAIR_SIZE = 2; +constexpr int32_t SEND_RETRY_LIMIT = 32; } // namespace SensorBasicDataChannel::SensorBasicDataChannel() : sendFd_(-1), receiveFd_(-1), isActive_(false) @@ -54,37 +55,48 @@ int32_t SensorBasicDataChannel::CreateSensorBasicChannel() receiveFd_ = -1; return SENSOR_CHANNEL_SOCKET_CREATE_ERR; } + auto closeFdWhenErr = [] (int32_t &fd){ + close(fd); + fd = -1; + }; + // set socket attr - int32_t ret = setsockopt(socketPair[0], SOL_SOCKET, SO_SNDBUF, &SENSOR_READ_DATA_SIZE, - sizeof(SENSOR_READ_DATA_SIZE)); + int32_t = ret = setsockopt(socketPair[0], SOL_SOCKET, SO_SNDBUF, &SENSOR_READ_DATA_SIZE, + sizeof(SENSOR_READ_DATA_SIZE)); if (ret != 0) { - SEN_HILOGE("setsockopt socketpair 0 failed"); + closeFdWhenErr(socketPair[0]); + SEN_HILOGE("setsockopt socketpair 0 failed, ret:%{public}d, errno:%{public}d", ret, errno); return SENSOR_CHANNEL_SOCKET_CREATE_ERR; } ret = setsockopt(socketPair[1], SOL_SOCKET, SO_RCVBUF, &SENSOR_READ_DATA_SIZE, sizeof(SENSOR_READ_DATA_SIZE)); if (ret != 0) { - SEN_HILOGE("setsockopt socketpair 1 failed"); + closeFdWhenErr(socketPair[1]); + SEN_HILOGE("setsockopt socketpair 1 failed, ret:%{public}d, errno:%{public}d", ret, errno); return SENSOR_CHANNEL_SOCKET_CREATE_ERR; } int32_t bufferSize = DEFAULT_CHANNEL_SIZE; ret = setsockopt(socketPair[0], SOL_SOCKET, SO_RCVBUF, &bufferSize, sizeof(bufferSize)); if (ret != 0) { - SEN_HILOGE("setsockopt socketpair 0 failed"); + closeFdWhenErr(socketPair[0]); + SEN_HILOGE("setsockopt socketpair 0 failed, ret:%{public}d, errno:%{public}d", ret, errno); return SENSOR_CHANNEL_SOCKET_CREATE_ERR; } ret = setsockopt(socketPair[1], SOL_SOCKET, SO_SNDBUF, &bufferSize, sizeof(bufferSize)); if (ret != 0) { - SEN_HILOGE("setsockopt socketpair 1 failed"); + closeFdWhenErr(socketPair[1]); + SEN_HILOGE("setsockopt socketpair 1 failed, ret:%{public}d, errno:%{public}d", ret, errno); return SENSOR_CHANNEL_SOCKET_CREATE_ERR; } ret = fcntl(socketPair[0], F_SETFL, O_NONBLOCK); if (ret != 0) { - SEN_HILOGE("fcntl socketpair 0 failed"); + closeFdWhenErr(socketPair[0]); + SEN_HILOGE("fcntl socketpair 0 failed, ret:%{public}d, errno:{public}d", ret, errno); return SENSOR_CHANNEL_SOCKET_CREATE_ERR; } ret = fcntl(socketPair[1], F_SETFL, O_NONBLOCK); if (ret != 0) { - SEN_HILOGE("fcntl socketpair 1 failed"); + closeFdWhenErr(socketPair[1]); + SEN_HILOGE("fcntl socketpair 1 failed, ret:%{public}d, errno:{public}", ret, errno); return SENSOR_CHANNEL_SOCKET_CREATE_ERR; } sendFd_ = socketPair[0]; @@ -96,7 +108,7 @@ int32_t SensorBasicDataChannel::CreateSensorBasicChannel() int32_t SensorBasicDataChannel::CreateSensorBasicChannel(MessageParcel &data) { CALL_LOG_ENTER; - if ((sendFd_ != -1) || (receiveFd_ != -1)) { + if (sendFd_ != -1) { SEN_HILOGD("already create socketpair"); return ERR_OK; } @@ -149,13 +161,15 @@ int32_t SensorBasicDataChannel::SendData(const void *vaddr, size_t size) { CHKPR(vaddr, SENSOR_CHANNEL_SEND_ADDR_ERR); if (sendFd_ < 0) { - SEN_HILOGE("failed, param is invalid"); + SEN_HILOGE("failed, sendFd is invalid"); return SENSOR_CHANNEL_SEND_ADDR_ERR; } - ssize_t length; + ssize_t length = 0; + int32_t retryCount = 0; do { length = send(sendFd_, vaddr, size, MSG_DONTWAIT | MSG_NOSIGNAL); - } while (errno == EINTR); + retryNum++; + } while (retryNum <= SEND_RETRY_LIMIT && errno == EINTR); if (length < 0) { HiSysEvent::Write(HiviewDFX::HiSysEvent::Domain::SENSOR, "SENSOR_DATA_CHANNEL_EXCEPTION", HiSysEvent::EventType::FAULT, "PKG_NAME", "SendData", "ERROR_CODE", errno); @@ -165,18 +179,6 @@ int32_t SensorBasicDataChannel::SendData(const void *vaddr, size_t size) return ERR_OK; } -int32_t SensorBasicDataChannel::ReceiveData(void *vaddr, size_t size) -{ - CHKPR(vaddr, SENSOR_CHANNEL_SEND_ADDR_ERR); - SEN_HILOGE("failed, vaddr is null or receiveFd_ invalid"); - return SENSOR_CHANNEL_RECEIVE_ADDR_ERR; - ssize_t length; - do { - length = recv(receiveFd_, vaddr, size, MSG_DONTWAIT); - } while (errno == EINTR); - return length; -} - int32_t SensorBasicDataChannel::GetSendDataFd() const { return sendFd_; @@ -187,7 +189,7 @@ int32_t SensorBasicDataChannel::GetReceiveDataFd() const return receiveFd_; } -int32_t SensorBasicDataChannel::DestroySensorBasicChannel() +void SensorBasicDataChannel::DestroySensorBasicChannel() { if (sendFd_ >= 0) { close(sendFd_); @@ -199,7 +201,6 @@ int32_t SensorBasicDataChannel::DestroySensorBasicChannel() receiveFd_ = -1; SEN_HILOGD("close receiveFd_ success"); } - return ERR_OK; } const std::unordered_map &SensorBasicDataChannel::GetDataCacheBuf() const