From 685921aa91e23490438b05fefc27a7521a02d5c4 Mon Sep 17 00:00:00 2001 From: hui1975 Date: Mon, 31 Oct 2022 11:03:24 +0800 Subject: [PATCH 1/5] =?UTF-8?q?set=E5=A4=B1=E8=B4=A5=E8=BF=94=E5=9B=9E?= =?UTF-8?q?=E5=89=8D=E8=A6=81=E5=85=B3=E9=97=AD=EF=BC=8C=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=89=93=E5=8D=B0ret=E5=92=8Cerrno?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: hui1975 Change-Id: Ia57a71898e27d3a8bfc11d95a2b77c273259f62d --- utils/src/sensor_basic_data_channel.cpp | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/utils/src/sensor_basic_data_channel.cpp b/utils/src/sensor_basic_data_channel.cpp index 0e7ef077..e807109c 100755 --- a/utils/src/sensor_basic_data_channel.cpp +++ b/utils/src/sensor_basic_data_channel.cpp @@ -54,37 +54,47 @@ 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)); 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]; -- Gitee From a100f40ea51e73872360be1e9347a14423b99ecf Mon Sep 17 00:00:00 2001 From: hui1975 Date: Mon, 31 Oct 2022 11:16:10 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E6=9D=A1=E4=BB=B6=E6=81=92=E6=88=90?= =?UTF-8?q?=E7=AB=8B=EF=BC=8C=E5=8F=AF=E4=BB=A5=E5=88=A0=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: hui1975 Change-Id: I693b4a2b235726d72a4b7c11f4af5729c49a4e63 --- utils/src/sensor_basic_data_channel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/src/sensor_basic_data_channel.cpp b/utils/src/sensor_basic_data_channel.cpp index e807109c..b416d77e 100755 --- a/utils/src/sensor_basic_data_channel.cpp +++ b/utils/src/sensor_basic_data_channel.cpp @@ -106,7 +106,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; } -- Gitee From 5ed0993778370b440402eff7151e48265c9bb450 Mon Sep 17 00:00:00 2001 From: hui1975 Date: Mon, 31 Oct 2022 11:22:59 +0800 Subject: [PATCH 3/5] =?UTF-8?q?do-while=E5=BE=AA=E7=8E=AF=E5=8A=A0?= =?UTF-8?q?=E6=AC=A1=E6=95=B0=E9=99=90=E5=88=B6=EF=BC=8C=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E4=B8=AD=E7=9A=84param=E6=94=B9=E4=B8=BAsendFd?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: hui1975 Change-Id: Ib1524df4486ec1d73fc952facbaee62c7acb4ffc --- utils/src/sensor_basic_data_channel.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/utils/src/sensor_basic_data_channel.cpp b/utils/src/sensor_basic_data_channel.cpp index b416d77e..3f67344a 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) @@ -159,13 +160,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); + retryCount++; + } 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); -- Gitee From 5f30c16254cdc0abd8563506816cb6d76ac53da1 Mon Sep 17 00:00:00 2001 From: hui1975 Date: Mon, 31 Oct 2022 11:29:49 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E5=87=BD=E6=95=B0ReceiveData=E6=9C=AA?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=EF=BC=8C=E5=88=A0=E9=99=A4=EF=BC=9B=E5=87=BD?= =?UTF-8?q?=E6=95=B0DestroySensorBasicChannel=E4=B8=8D=E9=9C=80=E8=A6=81?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: hui1975 Change-Id: I9b6788dd07d6e21303822de19952ff1296942c92 --- utils/include/sensor_basic_data_channel.h | 3 +-- utils/src/sensor_basic_data_channel.cpp | 15 +-------------- 2 files changed, 2 insertions(+), 16 deletions(-) diff --git a/utils/include/sensor_basic_data_channel.h b/utils/include/sensor_basic_data_channel.h index 30147e6b..e982b929 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 3f67344a..8f3f07c2 100755 --- a/utils/src/sensor_basic_data_channel.cpp +++ b/utils/src/sensor_basic_data_channel.cpp @@ -178,18 +178,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_; @@ -200,7 +188,7 @@ int32_t SensorBasicDataChannel::GetReceiveDataFd() const return receiveFd_; } -int32_t SensorBasicDataChannel::DestroySensorBasicChannel() +void SensorBasicDataChannel::DestroySensorBasicChannel() { if (sendFd_ >= 0) { close(sendFd_); @@ -212,7 +200,6 @@ int32_t SensorBasicDataChannel::DestroySensorBasicChannel() receiveFd_ = -1; SEN_HILOGD("close receiveFd_ success"); } - return ERR_OK; } const std::unordered_map &SensorBasicDataChannel::GetDataCacheBuf() const -- Gitee From 3d6412c3ca0d5f8ee3c0833f2345af0da4bd7ec1 Mon Sep 17 00:00:00 2001 From: hui1975 Date: Mon, 31 Oct 2022 14:44:01 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E5=B0=86=E7=94=A8MessageParcel=E5=88=9B?= =?UTF-8?q?=E5=BB=BAchannnel=E7=9A=84=E4=BB=A3=E7=A0=81=E7=A7=BB=E5=88=B0s?= =?UTF-8?q?ensor=5Fservice=5Fstub=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: hui1975 Change-Id: Ibbbe8b766e12205e47146c8cd40c2b2ca687ece5 --- .../native/sensor/src/sensor_data_channel.cpp | 3 +- services/sensor/src/sensor_service_stub.cpp | 22 ++++- utils/include/sensor_basic_data_channel.h | 2 +- utils/src/sensor_basic_data_channel.cpp | 84 ++++++------------- 4 files changed, 46 insertions(+), 65 deletions(-) diff --git a/frameworks/native/sensor/src/sensor_data_channel.cpp b/frameworks/native/sensor/src/sensor_data_channel.cpp index 1f466c9b..e3f0bad5 100644 --- a/frameworks/native/sensor/src/sensor_data_channel.cpp +++ b/frameworks/native/sensor/src/sensor_data_channel.cpp @@ -78,7 +78,8 @@ int32_t SensorDataChannel::DestroySensorDataChannel() CHKPL(eventHandler_); eventHandler_ = nullptr; // destroy sensor basic channelx - return DestroySensorBasicChannel(); + DestroySensorBasicChannel(); + return ERR_OK; } SensorDataChannel::~SensorDataChannel() diff --git a/services/sensor/src/sensor_service_stub.cpp b/services/sensor/src/sensor_service_stub.cpp index bed7a011..7acb7f86 100644 --- a/services/sensor/src/sensor_service_stub.cpp +++ b/services/sensor/src/sensor_service_stub.cpp @@ -155,10 +155,24 @@ ErrCode SensorServiceStub::CreateDataChannelInner(MessageParcel &data, MessagePa (void)reply; sptr sensorChannel = new (std::nothrow) SensorBasicDataChannel(); CHKPR(sensorChannel, OBJECT_NULL); - auto ret = sensorChannel->CreateSensorBasicChannel(data); - if (ret != ERR_OK) { - SEN_HILOGE("CreateSensorBasicChannel ret:%{public}d", ret); - return OBJECT_NULL; + int32_t sendFd = sensorChannel->GetSendDataFd(); + if (sendFd != -1) { + SEN_HILOGD("sendFd already created, sendFd:%{public}d", sendFd); + } else { + SEN_HILOGD("sendFd is -1"); + int32_t tmpFd = data.ReadFileDescriptor(); + if (tmpFd < 0) { + SEN_HILOGE("read FileDescriptor is failed"); + sendFd = -1; + return OBJECT_NULL; + } + sendFd = dup(tmpFd); + if (sendFd < 0) { + SEN_HILOGE("dup FileDescriptor is failed"); + sendFd = -1; + return OBJECT_NULL; + } + sensorChannel->SetSendDataFd(sendFd); } sptr sensorClient = data.ReadRemoteObject(); CHKPR(sensorClient, OBJECT_NULL); diff --git a/utils/include/sensor_basic_data_channel.h b/utils/include/sensor_basic_data_channel.h index e982b929..02b69c3a 100644 --- a/utils/include/sensor_basic_data_channel.h +++ b/utils/include/sensor_basic_data_channel.h @@ -41,9 +41,9 @@ public: SensorBasicDataChannel(); virtual ~SensorBasicDataChannel(); int32_t CreateSensorBasicChannel(); - int32_t CreateSensorBasicChannel(MessageParcel &data); void DestroySensorBasicChannel(); int32_t GetSendDataFd() const; + void SetSendDataFd(int32_t sendFd); int32_t GetReceiveDataFd() const; int32_t SendToBinder(MessageParcel &data); void CloseSendFd(); diff --git a/utils/src/sensor_basic_data_channel.cpp b/utils/src/sensor_basic_data_channel.cpp index 8f3f07c2..ba1e6e5a 100755 --- a/utils/src/sensor_basic_data_channel.cpp +++ b/utils/src/sensor_basic_data_channel.cpp @@ -55,74 +55,33 @@ int32_t SensorBasicDataChannel::CreateSensorBasicChannel() receiveFd_ = -1; return SENSOR_CHANNEL_SOCKET_CREATE_ERR; } - auto closeFdWhenErr = [] (int32_t &fd){ - close(fd); - fd = -1; + + int32_t ret = 0; + auto closeFdWhenErr = [&ret] (int32_t &sockFd) { + if (ret != 0) { + SEN_HILOGE("sockFd:%{public}d, ret:%{public}d, errno:%{public}d", sockFd, ret, errno); + close(sockFd); + sockFd = -1; + } + return SENSOR_CHANNEL_SOCKET_CREATE_ERR; }; // set socket attr - int32_t ret = setsockopt(socketPair[0], SOL_SOCKET, SO_SNDBUF, &SENSOR_READ_DATA_SIZE, - sizeof(SENSOR_READ_DATA_SIZE)); - if (ret != 0) { - 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[0], SOL_SOCKET, SO_SNDBUF, &SENSOR_READ_DATA_SIZE, sizeof(SENSOR_READ_DATA_SIZE)); + closeFdWhenErr(socketPair[0]); ret = setsockopt(socketPair[1], SOL_SOCKET, SO_RCVBUF, &SENSOR_READ_DATA_SIZE, sizeof(SENSOR_READ_DATA_SIZE)); - if (ret != 0) { - closeFdWhenErr(socketPair[1]); - SEN_HILOGE("setsockopt socketpair 1 failed, ret:%{public}d, errno:%{public}d", ret, errno); - return SENSOR_CHANNEL_SOCKET_CREATE_ERR; - } + closeFdWhenErr(socketPair[1]); int32_t bufferSize = DEFAULT_CHANNEL_SIZE; ret = setsockopt(socketPair[0], SOL_SOCKET, SO_RCVBUF, &bufferSize, sizeof(bufferSize)); - if (ret != 0) { - closeFdWhenErr(socketPair[0]); - SEN_HILOGE("setsockopt socketpair 0 failed, ret:%{public}d, errno:%{public}d", ret, errno); - return SENSOR_CHANNEL_SOCKET_CREATE_ERR; - } + closeFdWhenErr(socketPair[0]); ret = setsockopt(socketPair[1], SOL_SOCKET, SO_SNDBUF, &bufferSize, sizeof(bufferSize)); - if (ret != 0) { - closeFdWhenErr(socketPair[1]); - SEN_HILOGE("setsockopt socketpair 1 failed, ret:%{public}d, errno:%{public}d", ret, errno); - return SENSOR_CHANNEL_SOCKET_CREATE_ERR; - } + closeFdWhenErr(socketPair[1]); ret = fcntl(socketPair[0], F_SETFL, O_NONBLOCK); - if (ret != 0) { - closeFdWhenErr(socketPair[0]); - SEN_HILOGE("fcntl socketpair 0 failed, ret:%{public}d, errno:{public}d", ret, errno); - return SENSOR_CHANNEL_SOCKET_CREATE_ERR; - } + closeFdWhenErr(socketPair[0]); ret = fcntl(socketPair[1], F_SETFL, O_NONBLOCK); - if (ret != 0) { - closeFdWhenErr(socketPair[1]); - SEN_HILOGE("fcntl socketpair 1 failed, ret:%{public}d, errno:{public}", ret, errno); - return SENSOR_CHANNEL_SOCKET_CREATE_ERR; - } + closeFdWhenErr(socketPair[1]); sendFd_ = socketPair[0]; receiveFd_ = socketPair[1]; - SEN_HILOGD("create socketpair success,receiveFd_:%{public}d,sendFd_:%{public}d", receiveFd_, sendFd_); - return ERR_OK; -} - -int32_t SensorBasicDataChannel::CreateSensorBasicChannel(MessageParcel &data) -{ - CALL_LOG_ENTER; - if ((sendFd_ != -1)) { - SEN_HILOGD("already create socketpair"); - return ERR_OK; - } - int32_t tmpFd = data.ReadFileDescriptor(); - if (tmpFd < 0) { - SEN_HILOGE("ReadFileDescriptor is failed"); - sendFd_ = -1; - return SENSOR_CHANNEL_DUP_ERR; - } - sendFd_ = dup(tmpFd); - if (sendFd_ < 0) { - SEN_HILOGE("dup FileDescriptor is failed"); - sendFd_ = -1; - return SENSOR_CHANNEL_DUP_ERR; - } + SEN_HILOGD("create socketpair success, receiveFd_:%{public}d, sendFd_:%{public}d", receiveFd_, sendFd_); return ERR_OK; } @@ -168,7 +127,7 @@ int32_t SensorBasicDataChannel::SendData(const void *vaddr, size_t size) do { length = send(sendFd_, vaddr, size, MSG_DONTWAIT | MSG_NOSIGNAL); retryCount++; - } while (retryNum <= SEND_RETRY_LIMIT && errno == EINTR); + } while (retryCount <= 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); @@ -183,6 +142,13 @@ int32_t SensorBasicDataChannel::GetSendDataFd() const return sendFd_; } +void SensorBasicDataChannel::SetSendDataFd(int32_t sendFd) +{ + SEN_HILOGD("sendFd_:%{public}d", sendFd); + sendFd_ = sendFd; + return; +} + int32_t SensorBasicDataChannel::GetReceiveDataFd() const { return receiveFd_; -- Gitee