From 778178479626b0e5b4de0701103a1bb0a067702d Mon Sep 17 00:00:00 2001 From: Gerben Stavenga Date: Wed, 2 Aug 2017 18:25:28 -0700 Subject: Add destructors for default instances to the shutdown code. Verified test succeed under draconian heap checker --- src/google/protobuf/any.pb.cc | 3 +- src/google/protobuf/api.pb.cc | 11 ++- src/google/protobuf/compiler/cpp/cpp_message.cc | 4 +- .../protobuf/compiler/cpp/cpp_message_field.cc | 6 ++ src/google/protobuf/compiler/plugin.pb.cc | 14 ++-- src/google/protobuf/descriptor.pb.cc | 98 ++++++++++++++-------- src/google/protobuf/duration.pb.cc | 3 +- src/google/protobuf/empty.pb.cc | 3 +- src/google/protobuf/field_mask.pb.cc | 3 +- src/google/protobuf/source_context.pb.cc | 3 +- src/google/protobuf/struct.pb.cc | 12 ++- src/google/protobuf/stubs/common.cc | 11 +++ src/google/protobuf/stubs/common.h | 3 + src/google/protobuf/timestamp.pb.cc | 3 +- src/google/protobuf/type.pb.cc | 21 +++-- src/google/protobuf/wrappers.pb.cc | 27 ++++-- 16 files changed, 152 insertions(+), 73 deletions(-) mode change 100644 => 100755 src/google/protobuf/stubs/common.cc (limited to 'src/google') diff --git a/src/google/protobuf/any.pb.cc b/src/google/protobuf/any.pb.cc index e9419d07..1bd6cbe2 100644 --- a/src/google/protobuf/any.pb.cc +++ b/src/google/protobuf/any.pb.cc @@ -89,7 +89,8 @@ void TableStruct::InitDefaultsImpl() { ::google::protobuf::internal::InitProtobufDefaults(); _Any_default_instance_.DefaultConstruct(); -} + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_Any_default_instance_);} void InitDefaults() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); diff --git a/src/google/protobuf/api.pb.cc b/src/google/protobuf/api.pb.cc index dfbee724..903fd93b 100644 --- a/src/google/protobuf/api.pb.cc +++ b/src/google/protobuf/api.pb.cc @@ -125,9 +125,12 @@ void TableStruct::InitDefaultsImpl() { ::google::protobuf::protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto::InitDefaults(); ::google::protobuf::protobuf_google_2fprotobuf_2ftype_2eproto::InitDefaults(); _Api_default_instance_.DefaultConstruct(); - _Method_default_instance_.DefaultConstruct(); - _Mixin_default_instance_.DefaultConstruct(); - _Api_default_instance_.get_mutable()->source_context_ = const_cast< ::google::protobuf::SourceContext*>( + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_Api_default_instance_);_Method_default_instance_.DefaultConstruct(); + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_Method_default_instance_);_Mixin_default_instance_.DefaultConstruct(); + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_Mixin_default_instance_);_Api_default_instance_.get_mutable()->source_context_ = const_cast< ::google::protobuf::SourceContext*>( ::google::protobuf::SourceContext::internal_default_instance()); } @@ -244,7 +247,7 @@ Api::~Api() { void Api::SharedDtor() { name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); version_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); - delete source_context_; + if (this != internal_default_instance()) delete source_context_; } void Api::SetCachedSize(int size) const { diff --git a/src/google/protobuf/compiler/cpp/cpp_message.cc b/src/google/protobuf/compiler/cpp/cpp_message.cc index 79d0c633..abb2e95a 100644 --- a/src/google/protobuf/compiler/cpp/cpp_message.cc +++ b/src/google/protobuf/compiler/cpp/cpp_message.cc @@ -1977,7 +1977,9 @@ GenerateDefaultInstanceAllocator(io::Printer* printer) { // Construct the default instance. We can't call InitAsDefaultInstance() yet // because we need to make sure all default instances that this one might // depend on are constructed first. - printer->Print("_$classname$_default_instance_.DefaultConstruct();\n", + printer->Print("_$classname$_default_instance_.DefaultConstruct();\n" + "::google::protobuf::internal::OnShutdownDestroyMessage(\n" + " &_$classname$_default_instance_);", "classname", classname_); } diff --git a/src/google/protobuf/compiler/cpp/cpp_message_field.cc b/src/google/protobuf/compiler/cpp/cpp_message_field.cc index 5b260caa..da4c3950 100644 --- a/src/google/protobuf/compiler/cpp/cpp_message_field.cc +++ b/src/google/protobuf/compiler/cpp/cpp_message_field.cc @@ -522,6 +522,12 @@ GenerateSwappingCode(io::Printer* printer) const { void MessageFieldGenerator:: GenerateDestructorCode(io::Printer* printer) const { + // TODO(gerbens) Remove this when we don't need to destruct default instances. + // In google3 a default instance will never get deleted so we don't need to + // worry about that but in opensource protobuf default instances are deleted + // in shutdown process and we need to take special care when handling them. + printer->Print(variables_, + "if (this != internal_default_instance()) "); printer->Print(variables_, "delete $name$_;\n"); } diff --git a/src/google/protobuf/compiler/plugin.pb.cc b/src/google/protobuf/compiler/plugin.pb.cc index 6753d57d..5d7dad98 100644 --- a/src/google/protobuf/compiler/plugin.pb.cc +++ b/src/google/protobuf/compiler/plugin.pb.cc @@ -145,10 +145,14 @@ void TableStruct::InitDefaultsImpl() { ::google::protobuf::internal::InitProtobufDefaults(); ::google::protobuf::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaults(); _Version_default_instance_.DefaultConstruct(); - _CodeGeneratorRequest_default_instance_.DefaultConstruct(); - _CodeGeneratorResponse_File_default_instance_.DefaultConstruct(); - _CodeGeneratorResponse_default_instance_.DefaultConstruct(); - _CodeGeneratorRequest_default_instance_.get_mutable()->compiler_version_ = const_cast< ::google::protobuf::compiler::Version*>( + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_Version_default_instance_);_CodeGeneratorRequest_default_instance_.DefaultConstruct(); + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_CodeGeneratorRequest_default_instance_);_CodeGeneratorResponse_File_default_instance_.DefaultConstruct(); + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_CodeGeneratorResponse_File_default_instance_);_CodeGeneratorResponse_default_instance_.DefaultConstruct(); + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_CodeGeneratorResponse_default_instance_);_CodeGeneratorRequest_default_instance_.get_mutable()->compiler_version_ = const_cast< ::google::protobuf::compiler::Version*>( ::google::protobuf::compiler::Version::internal_default_instance()); } @@ -776,7 +780,7 @@ CodeGeneratorRequest::~CodeGeneratorRequest() { void CodeGeneratorRequest::SharedDtor() { parameter_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); - delete compiler_version_; + if (this != internal_default_instance()) delete compiler_version_; } void CodeGeneratorRequest::SetCachedSize(int size) const { diff --git a/src/google/protobuf/descriptor.pb.cc b/src/google/protobuf/descriptor.pb.cc index 0c76c932..d1918f3b 100644 --- a/src/google/protobuf/descriptor.pb.cc +++ b/src/google/protobuf/descriptor.pb.cc @@ -574,32 +574,58 @@ void TableStruct::InitDefaultsImpl() { ::google::protobuf::internal::InitProtobufDefaults(); _FileDescriptorSet_default_instance_.DefaultConstruct(); - _FileDescriptorProto_default_instance_.DefaultConstruct(); - _DescriptorProto_ExtensionRange_default_instance_.DefaultConstruct(); - _DescriptorProto_ReservedRange_default_instance_.DefaultConstruct(); - _DescriptorProto_default_instance_.DefaultConstruct(); - _ExtensionRangeOptions_default_instance_.DefaultConstruct(); - _FieldDescriptorProto_default_instance_.DefaultConstruct(); - _OneofDescriptorProto_default_instance_.DefaultConstruct(); - _EnumDescriptorProto_default_instance_.DefaultConstruct(); - _EnumValueDescriptorProto_default_instance_.DefaultConstruct(); - _ServiceDescriptorProto_default_instance_.DefaultConstruct(); - _MethodDescriptorProto_default_instance_.DefaultConstruct(); - _FileOptions_default_instance_.DefaultConstruct(); - _MessageOptions_default_instance_.DefaultConstruct(); - _FieldOptions_default_instance_.DefaultConstruct(); - _OneofOptions_default_instance_.DefaultConstruct(); - _EnumOptions_default_instance_.DefaultConstruct(); - _EnumValueOptions_default_instance_.DefaultConstruct(); - _ServiceOptions_default_instance_.DefaultConstruct(); - _MethodOptions_default_instance_.DefaultConstruct(); - _UninterpretedOption_NamePart_default_instance_.DefaultConstruct(); - _UninterpretedOption_default_instance_.DefaultConstruct(); - _SourceCodeInfo_Location_default_instance_.DefaultConstruct(); - _SourceCodeInfo_default_instance_.DefaultConstruct(); - _GeneratedCodeInfo_Annotation_default_instance_.DefaultConstruct(); - _GeneratedCodeInfo_default_instance_.DefaultConstruct(); - _FileDescriptorProto_default_instance_.get_mutable()->options_ = const_cast< ::google::protobuf::FileOptions*>( + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_FileDescriptorSet_default_instance_);_FileDescriptorProto_default_instance_.DefaultConstruct(); + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_FileDescriptorProto_default_instance_);_DescriptorProto_ExtensionRange_default_instance_.DefaultConstruct(); + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_DescriptorProto_ExtensionRange_default_instance_);_DescriptorProto_ReservedRange_default_instance_.DefaultConstruct(); + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_DescriptorProto_ReservedRange_default_instance_);_DescriptorProto_default_instance_.DefaultConstruct(); + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_DescriptorProto_default_instance_);_ExtensionRangeOptions_default_instance_.DefaultConstruct(); + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_ExtensionRangeOptions_default_instance_);_FieldDescriptorProto_default_instance_.DefaultConstruct(); + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_FieldDescriptorProto_default_instance_);_OneofDescriptorProto_default_instance_.DefaultConstruct(); + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_OneofDescriptorProto_default_instance_);_EnumDescriptorProto_default_instance_.DefaultConstruct(); + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_EnumDescriptorProto_default_instance_);_EnumValueDescriptorProto_default_instance_.DefaultConstruct(); + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_EnumValueDescriptorProto_default_instance_);_ServiceDescriptorProto_default_instance_.DefaultConstruct(); + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_ServiceDescriptorProto_default_instance_);_MethodDescriptorProto_default_instance_.DefaultConstruct(); + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_MethodDescriptorProto_default_instance_);_FileOptions_default_instance_.DefaultConstruct(); + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_FileOptions_default_instance_);_MessageOptions_default_instance_.DefaultConstruct(); + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_MessageOptions_default_instance_);_FieldOptions_default_instance_.DefaultConstruct(); + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_FieldOptions_default_instance_);_OneofOptions_default_instance_.DefaultConstruct(); + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_OneofOptions_default_instance_);_EnumOptions_default_instance_.DefaultConstruct(); + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_EnumOptions_default_instance_);_EnumValueOptions_default_instance_.DefaultConstruct(); + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_EnumValueOptions_default_instance_);_ServiceOptions_default_instance_.DefaultConstruct(); + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_ServiceOptions_default_instance_);_MethodOptions_default_instance_.DefaultConstruct(); + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_MethodOptions_default_instance_);_UninterpretedOption_NamePart_default_instance_.DefaultConstruct(); + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_UninterpretedOption_NamePart_default_instance_);_UninterpretedOption_default_instance_.DefaultConstruct(); + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_UninterpretedOption_default_instance_);_SourceCodeInfo_Location_default_instance_.DefaultConstruct(); + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_SourceCodeInfo_Location_default_instance_);_SourceCodeInfo_default_instance_.DefaultConstruct(); + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_SourceCodeInfo_default_instance_);_GeneratedCodeInfo_Annotation_default_instance_.DefaultConstruct(); + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_GeneratedCodeInfo_Annotation_default_instance_);_GeneratedCodeInfo_default_instance_.DefaultConstruct(); + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_GeneratedCodeInfo_default_instance_);_FileDescriptorProto_default_instance_.get_mutable()->options_ = const_cast< ::google::protobuf::FileOptions*>( ::google::protobuf::FileOptions::internal_default_instance()); _FileDescriptorProto_default_instance_.get_mutable()->source_code_info_ = const_cast< ::google::protobuf::SourceCodeInfo*>( ::google::protobuf::SourceCodeInfo::internal_default_instance()); @@ -1325,8 +1351,8 @@ void FileDescriptorProto::SharedDtor() { name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); package_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); syntax_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); - delete options_; - delete source_code_info_; + if (this != internal_default_instance()) delete options_; + if (this != internal_default_instance()) delete source_code_info_; } void FileDescriptorProto::SetCachedSize(int size) const { @@ -2625,7 +2651,7 @@ DescriptorProto_ExtensionRange::~DescriptorProto_ExtensionRange() { } void DescriptorProto_ExtensionRange::SharedDtor() { - delete options_; + if (this != internal_default_instance()) delete options_; } void DescriptorProto_ExtensionRange::SetCachedSize(int size) const { @@ -3425,7 +3451,7 @@ DescriptorProto::~DescriptorProto() { void DescriptorProto::SharedDtor() { name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); - delete options_; + if (this != internal_default_instance()) delete options_; } void DescriptorProto::SetCachedSize(int size) const { @@ -4820,7 +4846,7 @@ void FieldDescriptorProto::SharedDtor() { type_name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); default_value_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); json_name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); - delete options_; + if (this != internal_default_instance()) delete options_; } void FieldDescriptorProto::SetCachedSize(int size) const { @@ -5985,7 +6011,7 @@ OneofDescriptorProto::~OneofDescriptorProto() { void OneofDescriptorProto::SharedDtor() { name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); - delete options_; + if (this != internal_default_instance()) delete options_; } void OneofDescriptorProto::SetCachedSize(int size) const { @@ -6421,7 +6447,7 @@ EnumDescriptorProto::~EnumDescriptorProto() { void EnumDescriptorProto::SharedDtor() { name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); - delete options_; + if (this != internal_default_instance()) delete options_; } void EnumDescriptorProto::SetCachedSize(int size) const { @@ -6931,7 +6957,7 @@ EnumValueDescriptorProto::~EnumValueDescriptorProto() { void EnumValueDescriptorProto::SharedDtor() { name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); - delete options_; + if (this != internal_default_instance()) delete options_; } void EnumValueDescriptorProto::SetCachedSize(int size) const { @@ -7428,7 +7454,7 @@ ServiceDescriptorProto::~ServiceDescriptorProto() { void ServiceDescriptorProto::SharedDtor() { name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); - delete options_; + if (this != internal_default_instance()) delete options_; } void ServiceDescriptorProto::SetCachedSize(int size) const { @@ -7955,7 +7981,7 @@ void MethodDescriptorProto::SharedDtor() { name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); input_type_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); output_type_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); - delete options_; + if (this != internal_default_instance()) delete options_; } void MethodDescriptorProto::SetCachedSize(int size) const { diff --git a/src/google/protobuf/duration.pb.cc b/src/google/protobuf/duration.pb.cc index 36308d66..db0f9fd8 100644 --- a/src/google/protobuf/duration.pb.cc +++ b/src/google/protobuf/duration.pb.cc @@ -89,7 +89,8 @@ void TableStruct::InitDefaultsImpl() { ::google::protobuf::internal::InitProtobufDefaults(); _Duration_default_instance_.DefaultConstruct(); -} + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_Duration_default_instance_);} void InitDefaults() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); diff --git a/src/google/protobuf/empty.pb.cc b/src/google/protobuf/empty.pb.cc index 48fc4393..d418e67a 100644 --- a/src/google/protobuf/empty.pb.cc +++ b/src/google/protobuf/empty.pb.cc @@ -87,7 +87,8 @@ void TableStruct::InitDefaultsImpl() { ::google::protobuf::internal::InitProtobufDefaults(); _Empty_default_instance_.DefaultConstruct(); -} + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_Empty_default_instance_);} void InitDefaults() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); diff --git a/src/google/protobuf/field_mask.pb.cc b/src/google/protobuf/field_mask.pb.cc index 6f5b3a2f..60e3056b 100644 --- a/src/google/protobuf/field_mask.pb.cc +++ b/src/google/protobuf/field_mask.pb.cc @@ -88,7 +88,8 @@ void TableStruct::InitDefaultsImpl() { ::google::protobuf::internal::InitProtobufDefaults(); _FieldMask_default_instance_.DefaultConstruct(); -} + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_FieldMask_default_instance_);} void InitDefaults() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); diff --git a/src/google/protobuf/source_context.pb.cc b/src/google/protobuf/source_context.pb.cc index ded91127..effe0a43 100644 --- a/src/google/protobuf/source_context.pb.cc +++ b/src/google/protobuf/source_context.pb.cc @@ -88,7 +88,8 @@ void TableStruct::InitDefaultsImpl() { ::google::protobuf::internal::InitProtobufDefaults(); _SourceContext_default_instance_.DefaultConstruct(); -} + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_SourceContext_default_instance_);} void InitDefaults() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); diff --git a/src/google/protobuf/struct.pb.cc b/src/google/protobuf/struct.pb.cc index e7bacfbb..02f117fb 100644 --- a/src/google/protobuf/struct.pb.cc +++ b/src/google/protobuf/struct.pb.cc @@ -129,10 +129,14 @@ void TableStruct::InitDefaultsImpl() { ::google::protobuf::internal::InitProtobufDefaults(); _Struct_FieldsEntry_default_instance_.DefaultConstruct(); - _Struct_default_instance_.DefaultConstruct(); - _Value_default_instance_.DefaultConstruct(); - _ListValue_default_instance_.DefaultConstruct(); - _Struct_FieldsEntry_default_instance_.get_mutable()->set_default_instance(_Struct_FieldsEntry_default_instance_.get_mutable()); + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_Struct_FieldsEntry_default_instance_);_Struct_default_instance_.DefaultConstruct(); + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_Struct_default_instance_);_Value_default_instance_.DefaultConstruct(); + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_Value_default_instance_);_ListValue_default_instance_.DefaultConstruct(); + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_ListValue_default_instance_);_Struct_FieldsEntry_default_instance_.get_mutable()->set_default_instance(_Struct_FieldsEntry_default_instance_.get_mutable()); _Struct_FieldsEntry_default_instance_.get_mutable()->InitAsDefaultInstance(); _Value_default_instance_.null_value_ = 0; _Value_default_instance_.number_value_ = 0; diff --git a/src/google/protobuf/stubs/common.cc b/src/google/protobuf/stubs/common.cc old mode 100644 new mode 100755 index 78aa4d64..73822168 --- a/src/google/protobuf/stubs/common.cc +++ b/src/google/protobuf/stubs/common.cc @@ -30,6 +30,7 @@ // Author: kenton@google.com (Kenton Varda) +#include // TODO(gerbens) ideally remove this. #include #include #include @@ -424,10 +425,14 @@ struct ShutdownData { for (int i = 0; i < strings.size(); i++) { strings[i]->~string(); } + for (int i = 0; i < messages.size(); i++) { + messages[i]->~MessageLite(); + } } vector functions; vector strings; + vector messages; Mutex mutex; }; @@ -454,6 +459,12 @@ void OnShutdownDestroyString(const std::string* ptr) { shutdown_data->strings.push_back(ptr); } +void OnShutdownDestroyMessage(const void* ptr) { + InitShutdownFunctionsOnce(); + MutexLock lock(&shutdown_data->mutex); + shutdown_data->messages.push_back(static_cast(ptr)); +} + } // namespace internal void ShutdownProtobufLibrary() { diff --git a/src/google/protobuf/stubs/common.h b/src/google/protobuf/stubs/common.h index 4e4d7acf..ff363482 100644 --- a/src/google/protobuf/stubs/common.h +++ b/src/google/protobuf/stubs/common.h @@ -202,6 +202,9 @@ namespace internal { LIBPROTOBUF_EXPORT void OnShutdown(void (*func)()); // Destroy the string (call string destructor) LIBPROTOBUF_EXPORT void OnShutdownDestroyString(const std::string* ptr); +// Destroy (not delete) the message +LIBPROTOBUF_EXPORT void OnShutdownDestroyMessage(const void* ptr); + } // namespace internal #if PROTOBUF_USE_EXCEPTIONS diff --git a/src/google/protobuf/timestamp.pb.cc b/src/google/protobuf/timestamp.pb.cc index 9b19c33c..553fdef7 100644 --- a/src/google/protobuf/timestamp.pb.cc +++ b/src/google/protobuf/timestamp.pb.cc @@ -89,7 +89,8 @@ void TableStruct::InitDefaultsImpl() { ::google::protobuf::internal::InitProtobufDefaults(); _Timestamp_default_instance_.DefaultConstruct(); -} + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_Timestamp_default_instance_);} void InitDefaults() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); diff --git a/src/google/protobuf/type.pb.cc b/src/google/protobuf/type.pb.cc index 56f06edb..b9cc7a93 100644 --- a/src/google/protobuf/type.pb.cc +++ b/src/google/protobuf/type.pb.cc @@ -156,11 +156,16 @@ void TableStruct::InitDefaultsImpl() { ::google::protobuf::protobuf_google_2fprotobuf_2fany_2eproto::InitDefaults(); ::google::protobuf::protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto::InitDefaults(); _Type_default_instance_.DefaultConstruct(); - _Field_default_instance_.DefaultConstruct(); - _Enum_default_instance_.DefaultConstruct(); - _EnumValue_default_instance_.DefaultConstruct(); - _Option_default_instance_.DefaultConstruct(); - _Type_default_instance_.get_mutable()->source_context_ = const_cast< ::google::protobuf::SourceContext*>( + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_Type_default_instance_);_Field_default_instance_.DefaultConstruct(); + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_Field_default_instance_);_Enum_default_instance_.DefaultConstruct(); + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_Enum_default_instance_);_EnumValue_default_instance_.DefaultConstruct(); + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_EnumValue_default_instance_);_Option_default_instance_.DefaultConstruct(); + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_Option_default_instance_);_Type_default_instance_.get_mutable()->source_context_ = const_cast< ::google::protobuf::SourceContext*>( ::google::protobuf::SourceContext::internal_default_instance()); _Enum_default_instance_.get_mutable()->source_context_ = const_cast< ::google::protobuf::SourceContext*>( ::google::protobuf::SourceContext::internal_default_instance()); @@ -440,7 +445,7 @@ void Type::SharedDtor() { } name_.Destroy(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), arena); - delete source_context_; + if (this != internal_default_instance()) delete source_context_; } void Type::ArenaDtor(void* object) { @@ -2353,7 +2358,7 @@ void Enum::SharedDtor() { } name_.Destroy(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), arena); - delete source_context_; + if (this != internal_default_instance()) delete source_context_; } void Enum::ArenaDtor(void* object) { @@ -3535,7 +3540,7 @@ void Option::SharedDtor() { } name_.Destroy(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), arena); - delete value_; + if (this != internal_default_instance()) delete value_; } void Option::ArenaDtor(void* object) { diff --git a/src/google/protobuf/wrappers.pb.cc b/src/google/protobuf/wrappers.pb.cc index 6d0ef8df..f8f55842 100644 --- a/src/google/protobuf/wrappers.pb.cc +++ b/src/google/protobuf/wrappers.pb.cc @@ -176,15 +176,24 @@ void TableStruct::InitDefaultsImpl() { ::google::protobuf::internal::InitProtobufDefaults(); _DoubleValue_default_instance_.DefaultConstruct(); - _FloatValue_default_instance_.DefaultConstruct(); - _Int64Value_default_instance_.DefaultConstruct(); - _UInt64Value_default_instance_.DefaultConstruct(); - _Int32Value_default_instance_.DefaultConstruct(); - _UInt32Value_default_instance_.DefaultConstruct(); - _BoolValue_default_instance_.DefaultConstruct(); - _StringValue_default_instance_.DefaultConstruct(); - _BytesValue_default_instance_.DefaultConstruct(); -} + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_DoubleValue_default_instance_);_FloatValue_default_instance_.DefaultConstruct(); + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_FloatValue_default_instance_);_Int64Value_default_instance_.DefaultConstruct(); + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_Int64Value_default_instance_);_UInt64Value_default_instance_.DefaultConstruct(); + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_UInt64Value_default_instance_);_Int32Value_default_instance_.DefaultConstruct(); + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_Int32Value_default_instance_);_UInt32Value_default_instance_.DefaultConstruct(); + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_UInt32Value_default_instance_);_BoolValue_default_instance_.DefaultConstruct(); + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_BoolValue_default_instance_);_StringValue_default_instance_.DefaultConstruct(); + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_StringValue_default_instance_);_BytesValue_default_instance_.DefaultConstruct(); + ::google::protobuf::internal::OnShutdownDestroyMessage( + &_BytesValue_default_instance_);} void InitDefaults() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); -- cgit v1.2.3