diff --git a/frameworks/native/sensor/include/sensor_file_descriptor_listener.h b/frameworks/native/sensor/include/sensor_file_descriptor_listener.h index 165ba763029db259ad4121f83d8f151b02cedae0..68361ebe968267e09e0c66919023e4d571abceb6 100644 --- a/frameworks/native/sensor/include/sensor_file_descriptor_listener.h +++ b/frameworks/native/sensor/include/sensor_file_descriptor_listener.h @@ -34,8 +34,8 @@ public: void SetChannel(SensorDataChannel* channel); private: + int32_t ReceiveData(int32_t fileDescriptor, void *vaddr, size_t size); SensorDataChannel* channel_; - TransferSensorEvents *receiveDataBuff_ = nullptr; }; } // namespace Sensors } // namespace OHOS diff --git a/frameworks/native/sensor/src/sensor_file_descriptor_listener.cpp b/frameworks/native/sensor/src/sensor_file_descriptor_listener.cpp index 8dc136149f60440b9ee3d3a40b76c5cc23767360..97f5250e72351d3032147c81b3622ff38e9d0665 100644 --- a/frameworks/native/sensor/src/sensor_file_descriptor_listener.cpp +++ b/frameworks/native/sensor/src/sensor_file_descriptor_listener.cpp @@ -27,53 +27,73 @@ using namespace OHOS::AppExecFwk; namespace { constexpr HiLogLabel LABEL = { LOG_CORE, SENSOR_LOG_DOMAIN, "SensorFileDescriptorListener" }; constexpr int32_t RECEIVE_DATA_SIZE = 100; +constexpr int32_t MAX_RETRY_NUMBER = 32; } // namespace SensorFileDescriptorListener::SensorFileDescriptorListener() { channel_ = nullptr; - receiveDataBuff_ = - new (std::nothrow) TransferSensorEvents[sizeof(TransferSensorEvents) * RECEIVE_DATA_SIZE]; - CHKPL(receiveDataBuff_); } SensorFileDescriptorListener::~SensorFileDescriptorListener() { CALL_LOG_ENTER; - if (receiveDataBuff_ != nullptr) { - delete[] receiveDataBuff_; - receiveDataBuff_ = nullptr; +} + +int32_t SensorFileDescriptorListener::ReceiveData(int32_t fileDescriptor, void *vaddr, size_t size) +{ + if (fileDescriptor < 0 || vaddr == nullptr) { + SEN_HILOGE("Invalid fileDescriptor or vaddr is null, fileDescriptor:%{public}d", fileDescriptor); + return 0; + } + ssize_t length = 0; + int32_t retryNumber = 0; + while (true) { + ssize_t curLength = recv(fileDescriptor, vaddr, size, MSG_DONTWAIT | MSG_NOSIGNAL); + if (curLength > 0) { + length += curLength; + } else if (curLength < 0) { + if (retryNumber < MAX_RETRY_NUMBER && (errno == EAGAIN || errno == EINTR || errno == EWOULDBLOCK)) { + SEN_HILOGE("Need retry, errno is EAGAIN|EINTR|EWOULDBLOCK, curLength:%{public}zu, errno:%{public}d", + curLength, errno); + retryNumber++; + continue; + } + SEN_HILOGE("Recv return error, curLength:%{public}zu, errno:%{public}d", curLength, errno); + break; + } else { + SEN_HILOGE("curLength:0, errno:%{public}d", errno); + break; + } + if (curLength < size) { + break; + } } + return length; } void SensorFileDescriptorListener::OnReadable(int32_t fileDescriptor) { if (fileDescriptor < 0) { - SEN_HILOGE("fileDescriptor:%{public}d", fileDescriptor); + SEN_HILOGE("Invalid fileDescriptor:%{public}d", fileDescriptor); return; } FileDescriptorListener::OnReadable(fileDescriptor); - if (receiveDataBuff_ == nullptr) { - return; - } - int32_t len = - recv(fileDescriptor, receiveDataBuff_, sizeof(TransferSensorEvents) * RECEIVE_DATA_SIZE, 0); + TransferSensorEvents receiveDataBuff[RECEIVE_DATA_SIZE] = {}; + int32_t len = ReceiveData(fileDescriptor, receiveDataBuff, sizeof(TransferSensorEvents) * RECEIVE_DATA_SIZE); int32_t eventSize = static_cast(sizeof(TransferSensorEvents)); - while (len > 0) { - int32_t num = len / eventSize; - for (int i = 0; i < num; i++) { - SensorEvent event = { - .sensorTypeId = receiveDataBuff_[i].sensorTypeId, - .version = receiveDataBuff_[i].version, - .timestamp = receiveDataBuff_[i].timestamp, - .option = receiveDataBuff_[i].option, - .mode = receiveDataBuff_[i].mode, - .data = receiveDataBuff_[i].data, - .dataLen = receiveDataBuff_[i].dataLen - }; - channel_->dataCB_(&event, 1, channel_->privateData_); - } - len = recv(fileDescriptor, receiveDataBuff_, sizeof(TransferSensorEvents) * RECEIVE_DATA_SIZE, 0); + int32_t num = len / eventSize; + for (int i = 0; i < num; i++) { + SensorEvent event = { + .sensorTypeId = receiveDataBuff[i].sensorTypeId, + .version = receiveDataBuff[i].version, + .timestamp = receiveDataBuff[i].timestamp, + .option = receiveDataBuff[i].option, + .mode = receiveDataBuff[i].mode, + .data = receiveDataBuff[i].data, + .dataLen = receiveDataBuff[i].dataLen + }; + channel_->dataCB_(&event, 1, channel_->privateData_); } } @@ -90,10 +110,6 @@ void SensorFileDescriptorListener::OnShutdown(int32_t fileDescriptor) SEN_HILOGE("param is error:%{public}d", fileDescriptor); } FileDescriptorListener::OnShutdown(fileDescriptor); - if (receiveDataBuff_ != nullptr) { - delete[] receiveDataBuff_; - receiveDataBuff_ = nullptr; - } } void SensorFileDescriptorListener::OnException(int32_t fileDescriptor) @@ -103,10 +119,6 @@ void SensorFileDescriptorListener::OnException(int32_t fileDescriptor) return; } FileDescriptorListener::OnException(fileDescriptor); - if (receiveDataBuff_ != nullptr) { - delete[] receiveDataBuff_; - receiveDataBuff_ = nullptr; - } } } // namespace Sensors } // namespace OHOS \ No newline at end of file diff --git a/utils/src/sensor_basic_data_channel.cpp b/utils/src/sensor_basic_data_channel.cpp index 0e7ef0777eaf5c1609e4b19e50d3a17995c80444..f93878f2bba01d239733c4bd35613e67e4cfc59f 100755 --- a/utils/src/sensor_basic_data_channel.cpp +++ b/utils/src/sensor_basic_data_channel.cpp @@ -28,7 +28,7 @@ using namespace OHOS::HiviewDFX; namespace { constexpr HiLogLabel LABEL = { LOG_CORE, SENSOR_LOG_DOMAIN, "SensorBasicChannel" }; -constexpr int32_t SENSOR_READ_DATA_SIZE = sizeof(SensorEvent) * 100; +constexpr int32_t SENSOR_READ_DATA_SIZE = sizeof(TransferSensorEvents) * 100; constexpr int32_t DEFAULT_CHANNEL_SIZE = 2 * 1024; constexpr int32_t SOCKET_PAIR_SIZE = 2; } // namespace @@ -174,6 +174,10 @@ int32_t SensorBasicDataChannel::ReceiveData(void *vaddr, size_t size) do { length = recv(receiveFd_, vaddr, size, MSG_DONTWAIT); } while (errno == EINTR); + if (length < 0) { + SEN_HILOGE("length:%{public}zu, errno:%{public}d", length, errno); + return 0; + } return length; }