From dd476cc38f6fa89bdbe0d9c43bdbdd3ff0cc47c4 Mon Sep 17 00:00:00 2001 From: MyNameIsTrez Date: Fri, 5 Jan 2024 04:43:36 +0100 Subject: [PATCH] Make GetDirectoryList and GetFileList reentrant --- Managers/LuaMan.cpp | 22 ++++++++++------------ Managers/LuaMan.h | 8 ++++---- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/Managers/LuaMan.cpp b/Managers/LuaMan.cpp index 028c28dc82..6a9a0808a5 100644 --- a/Managers/LuaMan.cpp +++ b/Managers/LuaMan.cpp @@ -68,8 +68,8 @@ namespace RTE { .def("RangeRand", &LuaStateWrapper::RangeRand) .def("PosRand", &LuaStateWrapper::PosRand) .def("NormalRand", &LuaStateWrapper::NormalRand) - .def("GetDirectoryList", &LuaStateWrapper::DirectoryList, luabind::return_stl_iterator) - .def("GetFileList", &LuaStateWrapper::FileList, luabind::return_stl_iterator) + .def("GetDirectoryList", &LuaStateWrapper::DirectoryList, luabind::adopt(luabind::return_value) + luabind::return_stl_iterator) + .def("GetFileList", &LuaStateWrapper::FileList, luabind::adopt(luabind::return_value) + luabind::return_stl_iterator) .def("FileExists", &LuaStateWrapper::FileExists) .def("FileOpen", &LuaStateWrapper::FileOpen) .def("FileClose", &LuaStateWrapper::FileClose) @@ -273,8 +273,8 @@ namespace RTE { ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Passthrough LuaMan Functions - const std::vector& LuaStateWrapper::DirectoryList(const std::string& relativeDirectory) { return g_LuaMan.DirectoryList(relativeDirectory); } - const std::vector& LuaStateWrapper::FileList(const std::string& relativeDirectory) { return g_LuaMan.FileList(relativeDirectory); } + const std::vector* LuaStateWrapper::DirectoryList(const std::string& relativeDirectory) { return g_LuaMan.DirectoryList(relativeDirectory); } + const std::vector* LuaStateWrapper::FileList(const std::string& relativeDirectory) { return g_LuaMan.FileList(relativeDirectory); } bool LuaStateWrapper::FileExists(const std::string &fileName) { return g_LuaMan.FileExists(fileName); } int LuaStateWrapper::FileOpen(const std::string& fileName, const std::string& accessMode) { return g_LuaMan.FileOpen(fileName, accessMode); } void LuaStateWrapper::FileClose(int fileIndex) { return g_LuaMan.FileClose(fileIndex); } @@ -923,24 +923,22 @@ namespace RTE { ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - const std::vector & LuaMan::DirectoryList(const std::string &filePath) { - thread_local std::vector directoryPaths; - directoryPaths.clear(); + const std::vector * LuaMan::DirectoryList(const std::string &filePath) { + auto *directoryPaths = new std::vector(); for (const std::filesystem::directory_entry &directoryEntry : std::filesystem::directory_iterator(System::GetWorkingDirectory() + filePath)) { - if (directoryEntry.is_directory()) { directoryPaths.emplace_back(directoryEntry.path().filename().generic_string()); } + if (directoryEntry.is_directory()) { directoryPaths->emplace_back(directoryEntry.path().filename().generic_string()); } } return directoryPaths; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - const std::vector & LuaMan::FileList(const std::string &filePath) { - thread_local std::vector filePaths; - filePaths.clear(); + const std::vector * LuaMan::FileList(const std::string &filePath) { + auto *filePaths = new std::vector(); for (const std::filesystem::directory_entry &directoryEntry : std::filesystem::directory_iterator(System::GetWorkingDirectory() + filePath)) { - if (directoryEntry.is_regular_file()) { filePaths.emplace_back(directoryEntry.path().filename().generic_string()); } + if (directoryEntry.is_regular_file()) { filePaths->emplace_back(directoryEntry.path().filename().generic_string()); } } return filePaths; } diff --git a/Managers/LuaMan.h b/Managers/LuaMan.h index 1db4eb01c1..fe78e0935b 100644 --- a/Managers/LuaMan.h +++ b/Managers/LuaMan.h @@ -284,8 +284,8 @@ namespace RTE { double PosRand(); #pragma region Passthrough LuaMan Functions - const std::vector& DirectoryList(const std::string& relativeDirectory); - const std::vector& FileList(const std::string& relativeDirectory); + const std::vector* DirectoryList(const std::string& relativeDirectory); + const std::vector* FileList(const std::string& relativeDirectory); bool FileExists(const std::string &fileName); int FileOpen(const std::string& fileName, const std::string& accessMode); void FileClose(int fileIndex); @@ -433,7 +433,7 @@ namespace RTE { /// /// Directory path relative to the working directory. /// A vector of the directories in relativeDirectory. - const std::vector & DirectoryList(const std::string &relativeDirectory); + const std::vector * DirectoryList(const std::string &relativeDirectory); /// /// Returns a vector of all the files in relativeDirectory, which is relative to the working directory. @@ -441,7 +441,7 @@ namespace RTE { /// /// Directory path relative to the working directory. /// A vector of the files in relativeDirectory. - const std::vector & FileList(const std::string &relativeDirectory); + const std::vector * FileList(const std::string &relativeDirectory); /// /// Returns whether or not the specified file exists. You can only check for files inside .rte folders in the working directory.