From 47d1b999f580adabe271e3609c9a6f630f979031 Mon Sep 17 00:00:00 2001 From: HuuuuDaxia <2443930064@qq.com> Date: Thu, 29 May 2025 11:11:18 +0800 Subject: [PATCH] modify socket mutex range Signed-off-by: HuuuuDaxia <2443930064@qq.com> --- .../socket/socket_exec/src/socket_exec.cpp | 49 ++++++++++++------- 1 file changed, 30 insertions(+), 19 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 6b3acfbd5..37c15fecc 100644 --- a/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp +++ b/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp @@ -767,7 +767,6 @@ static bool PreparePollFds(int ¤tFd, std::vector &fds, return false; } - std::shared_lock lock(manager->GetDataMutex()); currentFd = static_cast(reinterpret_cast(manager->GetData())); if (currentFd <= 0) { NETSTACK_LOGE("currentFd: %{public}d is error", currentFd); @@ -805,16 +804,18 @@ 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; - int ret = -1; - { - std::shared_lock lock(g_fdMutex); - if (!PreparePollFds(currentFd, fds, socketCallbackMap, callback)) { - break; - } - - ret = poll(fds.data(), fds.size(), recvTimeoutMs); + if (!PreparePollFds(currentFd, fds, socketCallbackMap, callback)) { + break; } + + int ret = poll(fds.data(), fds.size(), recvTimeoutMs); if (ret < 0) { if (errno == EINTR) { continue; @@ -825,11 +826,8 @@ static void PollRecvData(int sock, sockaddr *addr, socklen_t addrLen, const Mess continue; } - { - std::shared_lock lock(g_fdMutex); - if (!ProcessRecvFds(bufInfo, addrInfo, callback, fds, socketCallbackMap)) { - break; - } + if (!ProcessRecvFds(bufInfo, addrInfo, callback, fds, socketCallbackMap)) { + break; } } @@ -1185,6 +1183,10 @@ bool ExecTcpSend(TcpSendContext *context) #ifdef FUZZ_TEST return true; #endif + if (context == nullptr) { + NETSTACK_LOGE("context is nullptr"); + return false; + } if (!context->IsParseOK()) { return false; } @@ -1193,7 +1195,12 @@ bool ExecTcpSend(TcpSendContext *context) context->SetPermissionDenied(true); return false; } - std::shared_lock lock(g_fdMutex); + std::shared_ptr manager = context->GetSharedManager(); + if (manager == nullptr) { + NETSTACK_LOGE("manager is nullptr"); + return false; + } + std::shared_lock lock(manager->GetDataMutex()); if (context->GetSocketFd() <= 0) { context->SetError(ERRNO_BAD_FD, strerror(ERRNO_BAD_FD)); NapiUtils::CreateUvQueueWorkEnhanced(context->GetEnv(), context, SocketAsyncWork::TcpSendCallback); @@ -1219,8 +1226,7 @@ bool ExecClose(CloseContext *context) inst->Close(); } } - - std::unique_lock lock(g_fdMutex); + std::unique_lock lock(manager->GetDataMutex()); if (context->GetSocketFd() < 0) { NETSTACK_LOGE("sock %{public}d is previous closed", context->GetSocketFd()); context->SetErrorCode(UNKNOW_ERROR); @@ -1974,7 +1980,12 @@ static void RemoveClientConnection(int32_t clientId, TcpServerCloseContext *cont NETSTACK_LOGI("remove clientfd and eventmanager clientid: %{public}d clientFd:%{public}d", it->first, it->second); if (!IsClientFdClosed(it->second)) { - std::unique_lock lock(g_fdMutex); + std::shared_ptr manager = context->GetSharedManager(); + if (manager == nullptr) { + NETSTACK_LOGE("manager is nullptr"); + return; + } + std::unique_lock lock(manager->GetDataMutex()); NETSTACK_LOGI("connectFD: %{public}d, not close should close", it->second); shutdown(it->second, SHUT_RDWR); close(it->second); @@ -2079,7 +2090,7 @@ static bool IsValidSock(int ¤tFd, const std::shared_ptr &man static int RecvWithSockCheck(int connectFD, char *buffer, uint32_t recvBufferSize, const std::shared_ptr &manager, int &recvSize) { - std::shared_lock lock(g_fdMutex); + std::shared_lock lock(manager->GetDataMutex()); if (buffer == nullptr) { return -1; } -- Gitee