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