diff --git a/src/ifcparse/file.cpp b/src/ifcparse/file.cpp index b4a277d04a..c5a4012bda 100644 --- a/src/ifcparse/file.cpp +++ b/src/ifcparse/file.cpp @@ -361,6 +361,8 @@ ifcopenshell::impl::rocks_db_file_storage::rocksdb_types_iterator::value_type co express::Base ifcopenshell::impl::rocks_db_file_storage::assert_existance(size_t number, instance_ref r) { #ifdef IFOPSH_WITH_ROCKSDB + std::lock_guard lock(instance_cache_mutex_); + if (r == ifcopenshell::impl::rocks_db_file_storage::entityinstance_ref) { auto it = instance_cache_.find(number); if (it != instance_cache_.end()) { diff --git a/src/ifcparse/parse.cpp b/src/ifcparse/parse.cpp index a49932d8f5..a60adb883f 100644 --- a/src/ifcparse/parse.cpp +++ b/src/ifcparse/parse.cpp @@ -2872,6 +2872,7 @@ void ifcopenshell::file::unbatch() { void ifcopenshell::file::reset_identity_cache() { std::visit([](auto& x) { if constexpr (std::is_same_v, impl::rocks_db_file_storage>) { + std::lock_guard lock(x.instance_cache_mutex_); x.instance_cache_.clear(); x.type_instance_cache_.clear(); } diff --git a/src/ifcparse/storage.h b/src/ifcparse/storage.h index c9f09638b4..50cf35a890 100644 --- a/src/ifcparse/storage.h +++ b/src/ifcparse/storage.h @@ -35,6 +35,7 @@ namespace rocksdb { #include #include #include +#include #include #ifndef SWIG @@ -354,6 +355,7 @@ namespace ifcopenshell { // @todo this is silly, but we cannot have the same type, this should be just a pointer then on the file side? typedef std::map> entity_by_iden_cache_t; entity_by_iden_cache_t instance_cache_, type_instance_cache_; + std::mutex instance_cache_mutex_; // @todo all these size_ts should probably be uint32_t for consistency with in-mem storage