From 894d18fba4e9920985e5d9d23391527b97893ca5 Mon Sep 17 00:00:00 2001 From: Kenichiro IDA Date: Wed, 16 Dec 2015 02:05:03 +0900 Subject: Alter FileDescriptorTables::kEmpty to GetEmptyInstance() --- src/google/protobuf/descriptor.cc | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'src/google/protobuf/descriptor.cc') diff --git a/src/google/protobuf/descriptor.cc b/src/google/protobuf/descriptor.cc index 9a1c6fe8..07a6ca22 100644 --- a/src/google/protobuf/descriptor.cc +++ b/src/google/protobuf/descriptor.cc @@ -560,7 +560,7 @@ class FileDescriptorTables { ~FileDescriptorTables(); // Empty table, used with placeholder files. - static const FileDescriptorTables kEmpty; + inline static const FileDescriptorTables& GetEmptyInstance(); // ----------------------------------------------------------------- // Finding items. @@ -665,7 +665,10 @@ FileDescriptorTables::FileDescriptorTables() FileDescriptorTables::~FileDescriptorTables() {} -const FileDescriptorTables FileDescriptorTables::kEmpty; +inline const FileDescriptorTables& FileDescriptorTables::GetEmptyInstance() { + static const FileDescriptorTables kEmpty; + return kEmpty; +} void DescriptorPool::Tables::AddCheckpoint() { checkpoints_.push_back(CheckPoint(this)); @@ -3535,7 +3538,7 @@ FileDescriptor* DescriptorBuilder::NewPlaceholderFile( placeholder->package_ = &internal::GetEmptyString(); placeholder->pool_ = pool_; placeholder->options_ = &FileOptions::default_instance(); - placeholder->tables_ = &FileDescriptorTables::kEmpty; + placeholder->tables_ = &FileDescriptorTables::GetEmptyInstance(); placeholder->source_code_info_ = &SourceCodeInfo::default_instance(); placeholder->is_placeholder_ = true; placeholder->syntax_ = FileDescriptor::SYNTAX_PROTO2; -- cgit v1.2.3 From 674e92d314cd79b2f47eab22a7c3af8732feb93f Mon Sep 17 00:00:00 2001 From: Kenichiro IDA Date: Sat, 19 Dec 2015 10:14:42 +0900 Subject: Initialize singleton instance by GoogleOnceInit() --- src/google/protobuf/descriptor.cc | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) (limited to 'src/google/protobuf/descriptor.cc') diff --git a/src/google/protobuf/descriptor.cc b/src/google/protobuf/descriptor.cc index 07a6ca22..bd60806e 100644 --- a/src/google/protobuf/descriptor.cc +++ b/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() { -- cgit v1.2.3