From 491d9b1b350eee6dfc65f1ed6624a1cfdb3b837e Mon Sep 17 00:00:00 2001 From: l00635678 Date: Tue, 22 Apr 2025 20:51:37 +0800 Subject: [PATCH] com.huawei.hmos.email-CPP_CRASH Signed-off-by: l00635678 --- .../napi/socket/socket_exec/src/socket_exec.cpp | 1 + utils/napi_utils/include/event_manager.h | 1 - utils/napi_utils/src/event_manager.cpp | 17 +++++++---------- 3 files changed, 8 insertions(+), 11 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 20c5cf644..e57c43aa1 100644 --- a/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp +++ b/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp @@ -767,6 +767,7 @@ 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); diff --git a/utils/napi_utils/include/event_manager.h b/utils/napi_utils/include/event_manager.h index e68f4b26b..12eb644e6 100644 --- a/utils/napi_utils/include/event_manager.h +++ b/utils/napi_utils/include/event_manager.h @@ -119,7 +119,6 @@ public: private: std::shared_mutex mutexForListenersAndEmitByUv_; - std::mutex mutexForEmitAndEmitByUv_; std::shared_mutex dataMutex_; std::mutex dataQueueMutex_; std::list listeners_; diff --git a/utils/napi_utils/src/event_manager.cpp b/utils/napi_utils/src/event_manager.cpp index 058122b89..545a75411 100644 --- a/utils/napi_utils/src/event_manager.cpp +++ b/utils/napi_utils/src/event_manager.cpp @@ -37,7 +37,7 @@ EventManager::~EventManager() void EventManager::AddListener(napi_env env, const std::string &type, napi_value callback, bool once, bool asyncCallback) { - std::unique_lock lock(mutexForListenersAndEmitByUv_); + std::unique_lock lock(mutexForListenersAndEmitByUv_); auto it = std::remove_if(listeners_.begin(), listeners_.end(), [type](const EventListener &listener) -> bool { return listener.MatchType(type); }); if (it != listeners_.end()) { @@ -49,7 +49,7 @@ void EventManager::AddListener(napi_env env, const std::string &type, napi_value void EventManager::DeleteListener(const std::string &type, napi_value callback) { - std::unique_lock lock(mutexForListenersAndEmitByUv_); + std::unique_lock lock(mutexForListenersAndEmitByUv_); auto it = std::remove_if(listeners_.begin(), listeners_.end(), [type, callback](const EventListener &listener) -> bool { return listener.Match(type, callback); @@ -59,10 +59,8 @@ void EventManager::DeleteListener(const std::string &type, napi_value callback) void EventManager::Emit(const std::string &type, const std::pair &argv) { - std::shared_lock lock2(mutexForListenersAndEmitByUv_); - auto listeners = listeners_; - lock2.unlock(); - std::for_each(listeners.begin(), listeners.end(), [type, argv](const EventListener &listener) { + std::unique_lock lock(mutexForListenersAndEmitByUv_); + std::for_each(listeners_.begin(), listeners_.end(), [type, argv](const EventListener &listener) { if (listener.IsAsyncCallback()) { /* AsyncCallback(BusinessError error, T data) */ napi_value arg[ASYNC_CALLBACK_PARAM_NUM] = {argv.first, argv.second}; @@ -74,7 +72,6 @@ void EventManager::Emit(const std::string &type, const std::pair bool { return listener.MatchOnce(type); }); listeners_.erase(it, listeners_.end()); @@ -92,7 +89,7 @@ void *EventManager::GetData() void EventManager::EmitByUvWithoutCheckShared(const std::string &type, void *data, void (*Handler)(uv_work_t *, int)) { - std::shared_lock lock2(mutexForListenersAndEmitByUv_); + std::shared_lock lock(mutexForListenersAndEmitByUv_); bool foundHeader = std::find_if(listeners_.begin(), listeners_.end(), [](const EventListener &listener) { return listener.MatchType(ON_HEADER_RECEIVE); }) != listeners_.end(); @@ -145,14 +142,14 @@ void *EventManager::GetQueueData() bool EventManager::HasEventListener(const std::string &type) { - std::shared_lock lock(mutexForListenersAndEmitByUv_); + std::shared_lock lock(mutexForListenersAndEmitByUv_); return std::any_of(listeners_.begin(), listeners_.end(), [&type](const EventListener &listener) -> bool { return listener.MatchType(type); }); } void EventManager::DeleteListener(const std::string &type) { - std::unique_lock lock(mutexForListenersAndEmitByUv_); + std::unique_lock lock(mutexForListenersAndEmitByUv_); auto it = std::remove_if(listeners_.begin(), listeners_.end(), [type](const EventListener &listener) -> bool { return listener.MatchType(type); }); listeners_.erase(it, listeners_.end()); -- Gitee