| 34 | } |
| 35 | |
| 36 | google::protobuf::MessageFactory* absl_nonnull RuntimeEnv::MutableMessageFactory() const { |
| 37 | google::protobuf::MessageFactory* absl_nullable shared_message_factory = |
| 38 | message_factory_ptr.load(std::memory_order_relaxed); |
| 39 | if (shared_message_factory != nullptr) { |
| 40 | return shared_message_factory; |
| 41 | } |
| 42 | absl::MutexLock lock(message_factory_mutex); |
| 43 | shared_message_factory = message_factory_ptr.load(std::memory_order_relaxed); |
| 44 | if (shared_message_factory == nullptr) { |
| 45 | if (descriptor_pool.get() == google::protobuf::DescriptorPool::generated_pool()) { |
| 46 | // Using the generated descriptor pool, just use the generated message |
| 47 | // factory. |
| 48 | message_factory = std::shared_ptr<google::protobuf::MessageFactory>( |
| 49 | google::protobuf::MessageFactory::generated_factory(), |
| 50 | internal::NoopDeleteFor<google::protobuf::MessageFactory>()); |
| 51 | } else { |
| 52 | auto dynamic_message_factory = |
| 53 | std::make_shared<google::protobuf::DynamicMessageFactory>(); |
| 54 | // Ensure we do not delegate to the generated factory, if the default |
| 55 | // every changes. We prefer being hermetic. |
| 56 | dynamic_message_factory->SetDelegateToGeneratedFactory(false); |
| 57 | message_factory = std::move(dynamic_message_factory); |
| 58 | } |
| 59 | shared_message_factory = message_factory.get(); |
| 60 | message_factory_ptr.store(shared_message_factory, |
| 61 | std::memory_order_seq_cst); |
| 62 | } |
| 63 | return shared_message_factory; |
| 64 | } |
| 65 | |
| 66 | void RuntimeEnv::KeepAlive(std::shared_ptr<const void> keep_alive) { |
| 67 | if (keep_alive == nullptr) { |
no test coverage detected