From 2006b19e4e6f2b7f34af6333ce4f72aa0c7bf966 Mon Sep 17 00:00:00 2001 From: HuuuuDaxia <2443930064@qq.com> Date: Wed, 11 Jun 2025 17:31:44 +0800 Subject: [PATCH 1/3] add mutex --- .../socket/socket_exec/src/socket_exec.cpp | 42 +++++++++++++------ 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp b/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp index 37c15fecc..140efc904 100644 --- a/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp +++ b/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp @@ -786,14 +786,25 @@ static bool PreparePollFds(int ¤tFd, std::vector &fds, return true; } -static void PollRecvData(int sock, sockaddr *addr, socklen_t addrLen, const MessageCallback &callback) +static void PollRecvData(sockaddr *addr, socklen_t addrLen, const MessageCallback &callback) { - int bufferSize = ConfirmBufferSize(sock); + std::shared_ptr manager = callback.GetEventManager(); + if (manager == nullptr) { + NETSTACK_LOGE("manager is nullptr"); + return; + } + std::shared_lock lock(manager->GetDataMutex()); + int socketfd = manager->GetData()? static_cast(reinterpret_cast(manager->GetData())) : -1; + if (socketfd < 0) { + NETSTACK_LOGE("fd is nullptr or closed"); + return; + } + int bufferSize = ConfirmBufferSize(socketfd); auto buf = std::make_unique(bufferSize); auto addrDeleter = [](sockaddr *a) { free(reinterpret_cast(a)); }; std::unique_ptr pAddr(addr, addrDeleter); - int recvTimeoutMs = ConfirmSocketTimeoutMs(sock, SO_RCVTIMEO, DEFAULT_POLL_TIMEOUT); + int recvTimeoutMs = ConfirmSocketTimeoutMs(socketfd, SO_RCVTIMEO, DEFAULT_POLL_TIMEOUT); if (recvTimeoutMs < 0) { return; } @@ -804,12 +815,6 @@ static void PollRecvData(int sock, sockaddr *addr, socklen_t addrLen, const Mess std::vector fds{}; while (true) { - std::shared_ptr manager = callback.GetEventManager(); - if (manager == nullptr) { - NETSTACK_LOGE("manager is nullptr"); - return; - } - std::shared_lock lock(manager->GetDataMutex()); int currentFd = -1; if (!PreparePollFds(currentFd, fds, socketCallbackMap, callback)) { break; @@ -963,7 +968,7 @@ bool ExecUdpBind(BindContext *context) return false; } NETSTACK_LOGI("copy ret = %{public}d", memcpy_s(pAddr6, sizeof(addr6), &addr6, sizeof(addr6))); - std::thread serviceThread(PollRecvData, context->GetSocketFd(), pAddr6, sizeof(addr6), + std::thread serviceThread(PollRecvData, pAddr6, sizeof(addr6), UdpMessageCallback(context->GetSharedManager())); #if defined(MAC_PLATFORM) || defined(IOS_PLATFORM) pthread_setname_np(SOCKET_EXEC_UDP_BIND); @@ -1167,7 +1172,7 @@ bool ExecConnect(ConnectContext *context) NETSTACK_LOGI("connect success, sock:%{public}d", context->GetSocketFd()); - std::thread serviceThread(PollRecvData, context->GetSocketFd(), nullptr, 0, + std::thread serviceThread(PollRecvData, nullptr, 0, TcpMessageCallback(context->GetSharedManager())); #if defined(MAC_PLATFORM) || defined(IOS_PLATFORM) pthread_setname_np(SOCKET_EXEC_CONNECT); @@ -1270,6 +1275,17 @@ static bool CheckSocketFd(GetStateContext *context, sockaddr &sockAddr) static bool GetSocketState(GetStateContext *context) { + std::shared_ptr manager = context->GetSharedManager(); + if (manager == nullptr) { + NETSTACK_LOGE("manager is nullptr"); + return false; + } + std::shared_lock lock(manager->GetDataMutex()); + int socketfd = manager->GetData()? static_cast(reinterpret_cast(manager->GetData())) : -1; + if (socketfd < 0) { + NETSTACK_LOGE("fd is nullptr or closed"); + return false; + } int opt; if (CheckClosed(context, opt)) { return true; @@ -1518,7 +1534,7 @@ bool RecvfromMulticast(MulticastMembershipContext *context) ERROR_RETURN(context, "v4bind err, port:%{public}d, errno:%{public}d", context->address_.GetPort(), errno); } NETSTACK_LOGI("copy ret = %{public}d", memcpy_s(pAddr4, sizeof(addr4), &addr4, sizeof(addr4))); - std::thread serviceThread(PollRecvData, context->GetSocketFd(), pAddr4, sizeof(addr4), + std::thread serviceThread(PollRecvData, pAddr4, sizeof(addr4), UdpMessageCallback(context->GetSharedManager())); RecvfromMulticastSetThreadName(serviceThread.native_handle()); serviceThread.detach(); @@ -1534,7 +1550,7 @@ bool RecvfromMulticast(MulticastMembershipContext *context) ERROR_RETURN(context, "v6bind err, port:%{public}d, errno:%{public}d", context->address_.GetPort(), errno); } NETSTACK_LOGI("copy ret = %{public}d", memcpy_s(pAddr6, sizeof(addr6), &addr6, sizeof(addr6))); - std::thread serviceThread(PollRecvData, context->GetSocketFd(), pAddr6, sizeof(addr6), + std::thread serviceThread(PollRecvData, pAddr6, sizeof(addr6), UdpMessageCallback(context->GetSharedManager())); RecvfromMulticastSetThreadName(serviceThread.native_handle()); serviceThread.detach(); -- Gitee From fd2bc2b89ec219a9eae8cfdaaec1c3c50fbaf932 Mon Sep 17 00:00:00 2001 From: HuuuuDaxia <2443930064@qq.com> Date: Wed, 11 Jun 2025 17:31:44 +0800 Subject: [PATCH 2/3] add mutex Signed-off-by: HuuuuDaxia <2443930064@qq.com> --- .../socket/socket_exec/src/socket_exec.cpp | 42 +++++++++++++------ 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp b/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp index 37c15fecc..140efc904 100644 --- a/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp +++ b/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp @@ -786,14 +786,25 @@ static bool PreparePollFds(int ¤tFd, std::vector &fds, return true; } -static void PollRecvData(int sock, sockaddr *addr, socklen_t addrLen, const MessageCallback &callback) +static void PollRecvData(sockaddr *addr, socklen_t addrLen, const MessageCallback &callback) { - int bufferSize = ConfirmBufferSize(sock); + std::shared_ptr manager = callback.GetEventManager(); + if (manager == nullptr) { + NETSTACK_LOGE("manager is nullptr"); + return; + } + std::shared_lock lock(manager->GetDataMutex()); + int socketfd = manager->GetData()? static_cast(reinterpret_cast(manager->GetData())) : -1; + if (socketfd < 0) { + NETSTACK_LOGE("fd is nullptr or closed"); + return; + } + int bufferSize = ConfirmBufferSize(socketfd); auto buf = std::make_unique(bufferSize); auto addrDeleter = [](sockaddr *a) { free(reinterpret_cast(a)); }; std::unique_ptr pAddr(addr, addrDeleter); - int recvTimeoutMs = ConfirmSocketTimeoutMs(sock, SO_RCVTIMEO, DEFAULT_POLL_TIMEOUT); + int recvTimeoutMs = ConfirmSocketTimeoutMs(socketfd, SO_RCVTIMEO, DEFAULT_POLL_TIMEOUT); if (recvTimeoutMs < 0) { return; } @@ -804,12 +815,6 @@ static void PollRecvData(int sock, sockaddr *addr, socklen_t addrLen, const Mess std::vector fds{}; while (true) { - std::shared_ptr manager = callback.GetEventManager(); - if (manager == nullptr) { - NETSTACK_LOGE("manager is nullptr"); - return; - } - std::shared_lock lock(manager->GetDataMutex()); int currentFd = -1; if (!PreparePollFds(currentFd, fds, socketCallbackMap, callback)) { break; @@ -963,7 +968,7 @@ bool ExecUdpBind(BindContext *context) return false; } NETSTACK_LOGI("copy ret = %{public}d", memcpy_s(pAddr6, sizeof(addr6), &addr6, sizeof(addr6))); - std::thread serviceThread(PollRecvData, context->GetSocketFd(), pAddr6, sizeof(addr6), + std::thread serviceThread(PollRecvData, pAddr6, sizeof(addr6), UdpMessageCallback(context->GetSharedManager())); #if defined(MAC_PLATFORM) || defined(IOS_PLATFORM) pthread_setname_np(SOCKET_EXEC_UDP_BIND); @@ -1167,7 +1172,7 @@ bool ExecConnect(ConnectContext *context) NETSTACK_LOGI("connect success, sock:%{public}d", context->GetSocketFd()); - std::thread serviceThread(PollRecvData, context->GetSocketFd(), nullptr, 0, + std::thread serviceThread(PollRecvData, nullptr, 0, TcpMessageCallback(context->GetSharedManager())); #if defined(MAC_PLATFORM) || defined(IOS_PLATFORM) pthread_setname_np(SOCKET_EXEC_CONNECT); @@ -1270,6 +1275,17 @@ static bool CheckSocketFd(GetStateContext *context, sockaddr &sockAddr) static bool GetSocketState(GetStateContext *context) { + std::shared_ptr manager = context->GetSharedManager(); + if (manager == nullptr) { + NETSTACK_LOGE("manager is nullptr"); + return false; + } + std::shared_lock lock(manager->GetDataMutex()); + int socketfd = manager->GetData()? static_cast(reinterpret_cast(manager->GetData())) : -1; + if (socketfd < 0) { + NETSTACK_LOGE("fd is nullptr or closed"); + return false; + } int opt; if (CheckClosed(context, opt)) { return true; @@ -1518,7 +1534,7 @@ bool RecvfromMulticast(MulticastMembershipContext *context) ERROR_RETURN(context, "v4bind err, port:%{public}d, errno:%{public}d", context->address_.GetPort(), errno); } NETSTACK_LOGI("copy ret = %{public}d", memcpy_s(pAddr4, sizeof(addr4), &addr4, sizeof(addr4))); - std::thread serviceThread(PollRecvData, context->GetSocketFd(), pAddr4, sizeof(addr4), + std::thread serviceThread(PollRecvData, pAddr4, sizeof(addr4), UdpMessageCallback(context->GetSharedManager())); RecvfromMulticastSetThreadName(serviceThread.native_handle()); serviceThread.detach(); @@ -1534,7 +1550,7 @@ bool RecvfromMulticast(MulticastMembershipContext *context) ERROR_RETURN(context, "v6bind err, port:%{public}d, errno:%{public}d", context->address_.GetPort(), errno); } NETSTACK_LOGI("copy ret = %{public}d", memcpy_s(pAddr6, sizeof(addr6), &addr6, sizeof(addr6))); - std::thread serviceThread(PollRecvData, context->GetSocketFd(), pAddr6, sizeof(addr6), + std::thread serviceThread(PollRecvData, pAddr6, sizeof(addr6), UdpMessageCallback(context->GetSharedManager())); RecvfromMulticastSetThreadName(serviceThread.native_handle()); serviceThread.detach(); -- Gitee From a92493bcb69be2accd96dc838dc8a5511d990376 Mon Sep 17 00:00:00 2001 From: HuuuuDaxia <2443930064@qq.com> Date: Wed, 11 Jun 2025 09:46:57 +0000 Subject: [PATCH 3/3] Revert "add mutex" This reverts commit 2006b19e4e6f2b7f34af6333ce4f72aa0c7bf966. --- .../socket/socket_exec/src/socket_exec.cpp | 42 ++++++------------- 1 file changed, 13 insertions(+), 29 deletions(-) diff --git a/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp b/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp index 140efc904..37c15fecc 100644 --- a/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp +++ b/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp @@ -786,25 +786,14 @@ static bool PreparePollFds(int ¤tFd, std::vector &fds, return true; } -static void PollRecvData(sockaddr *addr, socklen_t addrLen, const MessageCallback &callback) +static void PollRecvData(int sock, sockaddr *addr, socklen_t addrLen, const MessageCallback &callback) { - std::shared_ptr manager = callback.GetEventManager(); - if (manager == nullptr) { - NETSTACK_LOGE("manager is nullptr"); - return; - } - std::shared_lock lock(manager->GetDataMutex()); - int socketfd = manager->GetData()? static_cast(reinterpret_cast(manager->GetData())) : -1; - if (socketfd < 0) { - NETSTACK_LOGE("fd is nullptr or closed"); - return; - } - int bufferSize = ConfirmBufferSize(socketfd); + int bufferSize = ConfirmBufferSize(sock); auto buf = std::make_unique(bufferSize); auto addrDeleter = [](sockaddr *a) { free(reinterpret_cast(a)); }; std::unique_ptr pAddr(addr, addrDeleter); - int recvTimeoutMs = ConfirmSocketTimeoutMs(socketfd, SO_RCVTIMEO, DEFAULT_POLL_TIMEOUT); + int recvTimeoutMs = ConfirmSocketTimeoutMs(sock, SO_RCVTIMEO, DEFAULT_POLL_TIMEOUT); if (recvTimeoutMs < 0) { return; } @@ -815,6 +804,12 @@ static void PollRecvData(sockaddr *addr, socklen_t addrLen, const MessageCallbac std::vector fds{}; while (true) { + std::shared_ptr manager = callback.GetEventManager(); + if (manager == nullptr) { + NETSTACK_LOGE("manager is nullptr"); + return; + } + std::shared_lock lock(manager->GetDataMutex()); int currentFd = -1; if (!PreparePollFds(currentFd, fds, socketCallbackMap, callback)) { break; @@ -968,7 +963,7 @@ bool ExecUdpBind(BindContext *context) return false; } NETSTACK_LOGI("copy ret = %{public}d", memcpy_s(pAddr6, sizeof(addr6), &addr6, sizeof(addr6))); - std::thread serviceThread(PollRecvData, pAddr6, sizeof(addr6), + std::thread serviceThread(PollRecvData, context->GetSocketFd(), pAddr6, sizeof(addr6), UdpMessageCallback(context->GetSharedManager())); #if defined(MAC_PLATFORM) || defined(IOS_PLATFORM) pthread_setname_np(SOCKET_EXEC_UDP_BIND); @@ -1172,7 +1167,7 @@ bool ExecConnect(ConnectContext *context) NETSTACK_LOGI("connect success, sock:%{public}d", context->GetSocketFd()); - std::thread serviceThread(PollRecvData, nullptr, 0, + std::thread serviceThread(PollRecvData, context->GetSocketFd(), nullptr, 0, TcpMessageCallback(context->GetSharedManager())); #if defined(MAC_PLATFORM) || defined(IOS_PLATFORM) pthread_setname_np(SOCKET_EXEC_CONNECT); @@ -1275,17 +1270,6 @@ static bool CheckSocketFd(GetStateContext *context, sockaddr &sockAddr) static bool GetSocketState(GetStateContext *context) { - std::shared_ptr manager = context->GetSharedManager(); - if (manager == nullptr) { - NETSTACK_LOGE("manager is nullptr"); - return false; - } - std::shared_lock lock(manager->GetDataMutex()); - int socketfd = manager->GetData()? static_cast(reinterpret_cast(manager->GetData())) : -1; - if (socketfd < 0) { - NETSTACK_LOGE("fd is nullptr or closed"); - return false; - } int opt; if (CheckClosed(context, opt)) { return true; @@ -1534,7 +1518,7 @@ bool RecvfromMulticast(MulticastMembershipContext *context) ERROR_RETURN(context, "v4bind err, port:%{public}d, errno:%{public}d", context->address_.GetPort(), errno); } NETSTACK_LOGI("copy ret = %{public}d", memcpy_s(pAddr4, sizeof(addr4), &addr4, sizeof(addr4))); - std::thread serviceThread(PollRecvData, pAddr4, sizeof(addr4), + std::thread serviceThread(PollRecvData, context->GetSocketFd(), pAddr4, sizeof(addr4), UdpMessageCallback(context->GetSharedManager())); RecvfromMulticastSetThreadName(serviceThread.native_handle()); serviceThread.detach(); @@ -1550,7 +1534,7 @@ bool RecvfromMulticast(MulticastMembershipContext *context) ERROR_RETURN(context, "v6bind err, port:%{public}d, errno:%{public}d", context->address_.GetPort(), errno); } NETSTACK_LOGI("copy ret = %{public}d", memcpy_s(pAddr6, sizeof(addr6), &addr6, sizeof(addr6))); - std::thread serviceThread(PollRecvData, pAddr6, sizeof(addr6), + std::thread serviceThread(PollRecvData, context->GetSocketFd(), pAddr6, sizeof(addr6), UdpMessageCallback(context->GetSharedManager())); RecvfromMulticastSetThreadName(serviceThread.native_handle()); serviceThread.detach(); -- Gitee