Переглянути джерело

Initialize singleton instance by GoogleOnceInit()

Kenichiro IDA 9 роки тому
батько
коміт
674e92d314
1 змінених файлів з 24 додано та 2 видалено
  1. 24 2
      src/google/protobuf/descriptor.cc

+ 24 - 2
src/google/protobuf/descriptor.cc

@@ -665,9 +665,31 @@ FileDescriptorTables::FileDescriptorTables()
 
 FileDescriptorTables::~FileDescriptorTables() {}
 
+namespace {
+
+FileDescriptorTables* file_descriptor_tables_ = NULL;
+GOOGLE_PROTOBUF_DECLARE_ONCE(file_descriptor_tables_once_init_);
+
+void DeleteFileDescriptorTables() {
+  delete file_descriptor_tables_;
+  file_descriptor_tables_ = NULL;
+}
+
+void InitFileDescriptorTables() {
+  file_descriptor_tables_ = new FileDescriptorTables();
+  internal::OnShutdown(&DeleteFileDescriptorTables);
+}
+
+inline void InitFileDescriptorTablesOnce() {
+  ::google::protobuf::GoogleOnceInit(
+      &file_descriptor_tables_once_init_, &InitFileDescriptorTables);
+}
+
+}  // anonymous namespace
+
 inline const FileDescriptorTables& FileDescriptorTables::GetEmptyInstance() {
-    static const FileDescriptorTables kEmpty;
-    return kEmpty;
+  InitFileDescriptorTablesOnce();
+  return *file_descriptor_tables_;
 }
 
 void DescriptorPool::Tables::AddCheckpoint() {