diff --git a/frameworks/js/napi/file_access_module/napi_fileaccess_helper.cpp b/frameworks/js/napi/file_access_module/napi_fileaccess_helper.cpp index 7282e9c82e312a8298bebcf45340e160207ab2cf..3fa8c713f23b28f48b7ac62b608c040ab12042b0 100644 --- a/frameworks/js/napi/file_access_module/napi_fileaccess_helper.cpp +++ b/frameworks/js/napi/file_access_module/napi_fileaccess_helper.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include "file_access_framework_errno.h" #include "file_access_helper.h" @@ -49,8 +50,30 @@ namespace { using CallbackComplete = std::function; } +std::mutex g_fileAccessHelperMutex; std::list> g_fileAccessHelperList = {}; +static void AddFileAccessHelperList(std::pair, int> &createResult) +{ + std::lock_guard lock(g_fileAccessHelperMutex); + size_t fileAccessHelperSize = g_fileAccessHelperList.size(); + g_fileAccessHelperList.emplace_back(createResult.first); + size_t addSize = g_fileAccessHelperList.size() - fileAccessHelperSize; + HILOG_INFO("g_fileAccessHelperList addSize %{public}zu", addSize); +} + +static void RemoveFileAccessHelperList(FileAccessHelper *objectInfo) +{ + std::lock_guard lock(g_fileAccessHelperMutex); + size_t fileAccessHelperListSize = g_fileAccessHelperList.size(); + HILOG_INFO("g_fileAccessHelperList size before delete %{public}zu", fileAccessHelperListSize); + g_fileAccessHelperList.remove_if([objectInfo](const std::shared_ptr &fileAccessHelper) { + return objectInfo == fileAccessHelper.get(); + }); + size_t subtrationSize = fileAccessHelperListSize - g_fileAccessHelperList.size(); + HILOG_INFO("g_fileAccessHelperList subtrationSize %{public}zu", subtrationSize); +} + static napi_value FileAccessHelperConstructor(napi_env env, napi_callback_info info) { NFuncArg funcArg(env, info); @@ -80,15 +103,15 @@ static napi_value FileAccessHelperConstructor(napi_env env, napi_callback_info i CHECK_STATUS_RETURN(!(createResult.first == nullptr || createResult.second != ERR_OK), NapiFileInfoExporter::ThrowError(env, createResult.second), "FileAccessHelperConstructor: Creator failed ret=%{public}d", createResult.second); - g_fileAccessHelperList.emplace_back(createResult.first); + AddFileAccessHelperList(createResult); HILOG_INFO("g_fileAccessHelperList size %{public}zu", g_fileAccessHelperList.size()); auto finalize = [](napi_env env, void *data, void *hint) { FileAccessHelper *objectInfo = static_cast(data); if (objectInfo != nullptr) { objectInfo->Release(); - g_fileAccessHelperList.remove_if([objectInfo](const std::shared_ptr &fileAccessHelper) { - return objectInfo == fileAccessHelper.get(); - }); + std::lock_guard lock(g_fileAccessHelperMutex); + HILOG_INFO("g_fileAccessHelperList size before delete %{public}zu", g_fileAccessHelperList.size()); + RemoveFileAccessHelperList(objectInfo); objectInfo = nullptr; } };