60 static const google::protobuf::Descriptor*
61 find_descriptor(
const std::string& protobuf_type_name,
bool user_pool_first =
false);
73 template <
typename GoogleProtobufMessagePo
inter>
75 bool user_pool_first =
false)
77 DCCL_LOCK_DYNAMIC_PROTOBUF_MANAGER_MUTEX
79 const google::protobuf::Descriptor* desc =
82 return new_protobuf_message<GoogleProtobufMessagePointer>(desc);
84 throw(std::runtime_error(
"Unknown type " + protobuf_type_name +
85 ", be sure it is loaded at compile-time, via dlopen, or with "
86 "a call to add_protobuf_file()"));
94 template <
typename GoogleProtobufMessagePo
inter>
95 static GoogleProtobufMessagePointer
98 DCCL_LOCK_DYNAMIC_PROTOBUF_MANAGER_MUTEX
99 return GoogleProtobufMessagePointer(
100 get_instance()->msg_factory_->GetPrototype(desc)->New());
107 static std::shared_ptr<google::protobuf::Message>
114 static std::shared_ptr<google::protobuf::Message>
118 static void add_database(std::shared_ptr<google::protobuf::DescriptorDatabase> database);
123 DCCL_LOCK_DYNAMIC_PROTOBUF_MANAGER_MUTEX
124 get_instance()->enable_disk_source_database();
137 static const google::protobuf::FileDescriptor*
150 static void protobuf_shutdown()
152 DCCL_LOCK_DYNAMIC_PROTOBUF_MANAGER_MUTEX
153 get_instance()->shutdown();
157 static const google::protobuf::FileDescriptor*
162 DCCL_LOCK_DYNAMIC_PROTOBUF_MANAGER_MUTEX
163 inst_.reset(
new DynamicProtobufManager, DynamicProtobufManager::custom_deleter);
166 static void custom_deleter(DynamicProtobufManager* obj) {
delete obj; }
168#if !(DCCL_THREAD_SUPPORT)
171 static google::protobuf::DynamicMessageFactory& msg_factory()
173 return *get_instance()->msg_factory_;
175 static google::protobuf::DescriptorPool& user_descriptor_pool()
177 return *get_instance()->user_descriptor_pool_;
179 static google::protobuf::SimpleDescriptorDatabase& simple_database()
181 return *get_instance()->simple_database_;
184 template <
typename T =
void>
static google::protobuf::DynamicMessageFactory& msg_factory()
186 static_assert(!std::is_same<T, T>::value,
187 "msg_factory() has been removed for thread-safety "
188 "reasons, use msg_factory_call(...) instead.");
190 return *get_instance()->msg_factory_;
192 template <
typename T =
void>
static google::protobuf::DescriptorPool& user_descriptor_pool()
194 static_assert(!std::is_same<T, T>::value,
195 "user_descriptor_pool() has been removed for thread-safety reasons, use "
196 "user_descriptor_pool_call(...) instead.");
198 return *get_instance()->user_descriptor_pool_;
200 template <
typename T =
void>
201 static google::protobuf::SimpleDescriptorDatabase& simple_database()
203 static_assert(!std::is_same<T, T>::value,
204 "simple_database() has been removed for thread-safety reasons, use "
205 "simple_database_call(...) instead.");
207 return *get_instance()->simple_database_;
211 template <
typename ReturnType,
typename... Args1,
typename... Args2>
213 msg_factory_call(ReturnType (google::protobuf::DynamicMessageFactory::*func)(Args1...) const,
216 DCCL_LOCK_DYNAMIC_PROTOBUF_MANAGER_MUTEX
217 return ((*get_instance()->msg_factory_).*func)(args...);
220 template <
typename ReturnType,
typename... Args1,
typename... Args2>
222 user_descriptor_pool_call(ReturnType (google::protobuf::DescriptorPool::*func)(Args1...) const,
225 DCCL_LOCK_DYNAMIC_PROTOBUF_MANAGER_MUTEX
226 return ((*get_instance()->user_descriptor_pool_).*func)(args...);
229 template <
typename ReturnType,
typename... Args1,
typename... Args2>
231 simple_database_call(ReturnType (google::protobuf::SimpleDescriptorDatabase::*func)(Args1...)
235 DCCL_LOCK_DYNAMIC_PROTOBUF_MANAGER_MUTEX
236 return ((*get_instance()->simple_database_).*func)(args...);
240 static std::shared_ptr<DynamicProtobufManager> inst_;
241 static DynamicProtobufManager* get_instance()
243 DCCL_LOCK_DYNAMIC_PROTOBUF_MANAGER_MUTEX
246 inst_.reset(
new DynamicProtobufManager, DynamicProtobufManager::custom_deleter);
250 DynamicProtobufManager()
251 : generated_database_(new google::protobuf::DescriptorPoolDatabase(
252 *google::protobuf::DescriptorPool::generated_pool())),
253 simple_database_(new google::protobuf::SimpleDescriptorDatabase),
254 msg_factory_(new google::protobuf::DynamicMessageFactory)
256 databases_.push_back(simple_database_);
257 databases_.push_back(generated_database_);
259 msg_factory_->SetDelegateToGeneratedFactory(
true);
264 ~DynamicProtobufManager() =
default;
268 for (
auto& dl_handle : dl_handles_) dlclose(dl_handle);
269 google::protobuf::ShutdownProtobufLibrary();
273 void update_databases()
275 std::vector<google::protobuf::DescriptorDatabase*> databases;
277 for (
const auto& database : databases_) databases.push_back(database.get());
279 merged_database_.reset(
new google::protobuf::MergedDescriptorDatabase(databases));
280 user_descriptor_pool_.reset(
new google::protobuf::DescriptorPool(merged_database_.get()));
283 void enable_disk_source_database();
286 std::vector<std::shared_ptr<google::protobuf::DescriptorDatabase>> databases_;
289 std::shared_ptr<google::protobuf::DescriptorPoolDatabase> generated_database_;
290 std::shared_ptr<google::protobuf::SimpleDescriptorDatabase> simple_database_;
291 std::shared_ptr<google::protobuf::MergedDescriptorDatabase> merged_database_;
292 std::shared_ptr<google::protobuf::DescriptorPool> user_descriptor_pool_;
293 std::shared_ptr<google::protobuf::DynamicMessageFactory> msg_factory_;
296 std::shared_ptr<google::protobuf::compiler::DiskSourceTree> disk_source_tree_;
297 std::shared_ptr<google::protobuf::compiler::SourceTreeDescriptorDatabase> source_database_;
302#if GOOGLE_PROTOBUF_VERSION >= 4022000
303 void RecordError(absl::string_view filename,
int line,
int column,
304 absl::string_view message)
override;
306 void AddError(
const std::string& filename,
int line,
int column,
307 const std::string& message)
override;
311 std::shared_ptr<DLogMultiFileErrorCollector> error_collector_;
313 std::vector<void*> dl_handles_;