diff --git a/muse b/muse index 5246c265c45f6..7f700fb0ece4d 160000 --- a/muse +++ b/muse @@ -1 +1 @@ -Subproject commit 5246c265c45f6227c8e35f41bc581d795e0e8465 +Subproject commit 7f700fb0ece4deec62bdafdc8d5b0ade7c46a552 diff --git a/src/engraving/infrastructure/eid.cpp b/src/engraving/infrastructure/eid.cpp index 3a1c125a3f8c1..33decf69fb06f 100644 --- a/src/engraving/infrastructure/eid.cpp +++ b/src/engraving/infrastructure/eid.cpp @@ -182,8 +182,8 @@ EID EID::fromStdString(const std::string_view& s) EID EID::newUnique() { static std::random_device s_device; - static std::mt19937_64 s_engine(s_device()); - static std::uniform_int_distribution s_unifDist; + thread_local static std::mt19937_64 s_engine(s_device()); + thread_local static std::uniform_int_distribution s_unifDist; return EID(s_unifDist(s_engine), s_unifDist(s_engine)); } diff --git a/src/engraving/infrastructure/eidregister.cpp b/src/engraving/infrastructure/eidregister.cpp index badb7bd3e1e39..ee0e721b0cc10 100644 --- a/src/engraving/infrastructure/eidregister.cpp +++ b/src/engraving/infrastructure/eidregister.cpp @@ -37,6 +37,7 @@ EID EIDRegister::newEIDForItem(const EngravingObject* item) void EIDRegister::registerItemEID(const EID& eid, const EngravingObject* item) { + std::lock_guard lock(m_mutex); IF_ASSERT_FAILED(eid.isValid() && item) { return; } @@ -58,6 +59,7 @@ void EIDRegister::registerItemEID(const EID& eid, const EngravingObject* item) void EIDRegister::removeItem(const EngravingObject* item) { + std::lock_guard lock(m_mutex); // NOTE: needed only when elements are removed during read (e.g. broken spanners) auto itemIter = m_itemToEid.find(const_cast(item)); @@ -78,6 +80,7 @@ void EIDRegister::removeItem(const EngravingObject* item) EngravingObject* EIDRegister::itemFromEID(const EID& eid) const { + std::shared_lock lock(m_mutex); auto iter = m_eidToItem.find(eid); IF_ASSERT_FAILED(iter != m_eidToItem.end()) { return nullptr; @@ -87,6 +90,7 @@ EngravingObject* EIDRegister::itemFromEID(const EID& eid) const EID EIDRegister::EIDFromItem(const EngravingObject* item) const { + std::shared_lock lock(m_mutex); auto iter = m_itemToEid.find(const_cast(item)); return iter == m_itemToEid.end() ? EID::invalid() : iter->second; } diff --git a/src/engraving/infrastructure/eidregister.h b/src/engraving/infrastructure/eidregister.h index fc25d073628ee..76dd07306ae29 100644 --- a/src/engraving/infrastructure/eidregister.h +++ b/src/engraving/infrastructure/eidregister.h @@ -23,6 +23,7 @@ #include #include +#include #include "eid.h" #include "../types/types.h" @@ -49,5 +50,7 @@ class EIDRegister std::unordered_map m_itemToEid; uint64_t m_maxValTestMode = 0; + + mutable std::shared_mutex m_mutex; }; } diff --git a/src/engraving/rw/write/writer.cpp b/src/engraving/rw/write/writer.cpp index 58a2c0bb881d1..e391567135eab 100644 --- a/src/engraving/rw/write/writer.cpp +++ b/src/engraving/rw/write/writer.cpp @@ -231,8 +231,10 @@ void Writer::write(Score* score, XmlWriter& xml, WriteContext& ctx, compat::Writ ctx.setCurTrack(0); - // Let's decide: write midi mapping to a file or not - score->masterScore()->checkMidiMapping(); + if (score->isMaster()) { + // Let's decide: write midi mapping to a file or not + score->masterScore()->checkMidiMapping(); + } auto shouldWritePart = [&ctx, score, staffStart, staffEnd](const Part* part) { if (!ctx.shouldWriteRange()) { diff --git a/src/engraving/rw/write/writer.h b/src/engraving/rw/write/writer.h index e4e5b7cbbfae5..74aef134b83d6 100644 --- a/src/engraving/rw/write/writer.h +++ b/src/engraving/rw/write/writer.h @@ -32,7 +32,7 @@ namespace mu::engraving::write { class Writer : public rw::IWriter { - muse::GlobalInject application; + muse::GlobalThreadSafeInject application; public: