diff --git a/src/cpp/helpers/ArchiveIO.h b/src/cpp/helpers/ArchiveIO.h index b97666ecdc..00805d9acb 100644 --- a/src/cpp/helpers/ArchiveIO.h +++ b/src/cpp/helpers/ArchiveIO.h @@ -27,11 +27,14 @@ class ArchiveIOSpecificException : public std::runtime_error { std::to_string(expectedStatus) + " expected)") {} }; #include +#include class ArchiveIO { private: std::filesystem::path archivePath_; protected: + mutable std::shared_mutex mutex_; + virtual void Create() = 0; public: diff --git a/src/cpp/helpers/ArchiveReader.cpp b/src/cpp/helpers/ArchiveReader.cpp index f06f12cdb1..cdfc1515ee 100644 --- a/src/cpp/helpers/ArchiveReader.cpp +++ b/src/cpp/helpers/ArchiveReader.cpp @@ -34,6 +34,7 @@ int32_t ArchiveReader::ExtractFile( int32_t ArchiveReader::ExtractFile( const std::filesystem::path& fileToExtractPath, const std::filesystem::path& destination) { + std::unique_lock lock(mutex_); int32_t err = MZ_OK; LocateEntry(fileToExtractPath); OpenEntry(fileToExtractPath); @@ -74,6 +75,7 @@ void ArchiveReader::OpenEntry(const std::filesystem::path& fileToExtractPath) { } std::istringstream ArchiveReader::ExtractFileInStringStream( const std::filesystem::path& FileToExtractPath) { + std::unique_lock lock(mutex_); LocateEntry(FileToExtractPath); OpenEntry(FileToExtractPath); int32_t len = mz_zip_reader_entry_save_buffer_length(internalPointer_); diff --git a/src/cpp/helpers/ArchiveWriter.cpp b/src/cpp/helpers/ArchiveWriter.cpp index 9c0ca3fe0f..712f9b5bfc 100644 --- a/src/cpp/helpers/ArchiveWriter.cpp +++ b/src/cpp/helpers/ArchiveWriter.cpp @@ -39,6 +39,7 @@ int32_t ArchiveWriter::Close() { return mz_zip_writer_close(internalPointer_); } void ArchiveWriter::Delete() { mz_zip_writer_delete(&internalPointer_); } int32_t ArchiveWriter::AddFileInArchive(const FileBuffer& FileBufferToAdd) { + std::unique_lock lock(mutex_); fileInfo_.filename = FileBufferToAdd.fname.c_str(); fileInfo_.creation_date = std::time(0); int32_t err = mz_zip_writer_entry_open(internalPointer_, &fileInfo_); @@ -75,6 +76,7 @@ int32_t ArchiveWriter::AddFileInArchive(const FileBuffer& FileBufferToAdd) { } int32_t ArchiveWriter::AddFileInArchive( const std::filesystem::path& FileToAdd) { + std::unique_lock lock(mutex_); auto err = mz_zip_writer_add_file(internalPointer_, FileToAdd.string().c_str(), FileToAdd.filename().string().c_str()); diff --git a/src/cpp/lpnamer/problem_modifier/LinkProblemsGenerator.cpp b/src/cpp/lpnamer/problem_modifier/LinkProblemsGenerator.cpp index ca2f2d67e6..8e88abe1d5 100644 --- a/src/cpp/lpnamer/problem_modifier/LinkProblemsGenerator.cpp +++ b/src/cpp/lpnamer/problem_modifier/LinkProblemsGenerator.cpp @@ -129,9 +129,9 @@ void LinkProblemsGenerator::treatloop(const std::filesystem::path &root, auto writer = ArchiveWriter(tmpArchivePath); writer.Open(); auto mpsList = readMPSList(mps_file_name); - std::for_each(std::execution::seq, mpsList.begin(), mpsList.end(), [&](const auto& mps) { - treat(root, mps, couplings, reader, writer); - }); + std::for_each( + std::execution::par, mpsList.begin(), mpsList.end(), + [&](const auto &mps) { treat(root, mps, couplings, reader, writer); }); reader.Close(); reader.Delete(); writer.Close();