aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Feng Xiao <xfxyjwf@gmail.com>2014-12-03 16:31:47 -0800
committerGravatar Feng Xiao <xfxyjwf@gmail.com>2014-12-03 16:31:47 -0800
commit137dd0f17f91ca008fa2ab0a17b1e02865e8f8ca (patch)
tree75450f3a5f3819eba4b061ec20c96e8936685834 /src
parent35ef68056cf84f581c2eab389f78a876f13cd661 (diff)
Delete some globals in ShutdownProtobufLibrary().
Diffstat (limited to 'src')
-rw-r--r--src/google/protobuf/descriptor.cc5
-rw-r--r--src/google/protobuf/map_entry.h5
-rw-r--r--src/google/protobuf/map_field.cc27
3 files changed, 37 insertions, 0 deletions
diff --git a/src/google/protobuf/descriptor.cc b/src/google/protobuf/descriptor.cc
index 19d49cab..b8dd198d 100644
--- a/src/google/protobuf/descriptor.cc
+++ b/src/google/protobuf/descriptor.cc
@@ -345,6 +345,10 @@ typedef hash_map<string, const SourceCodeInfo_Location*> LocationsByPathMap;
set<string>* allowed_proto3_extendees_ = NULL;
GOOGLE_PROTOBUF_DECLARE_ONCE(allowed_proto3_extendees_init_);
+void DeleteAllowedProto3Extendee() {
+ delete allowed_proto3_extendees_;
+}
+
void InitAllowedProto3Extendee() {
allowed_proto3_extendees_ = new set<string>;
allowed_proto3_extendees_->insert("google.protobuf.FileOptions");
@@ -354,6 +358,7 @@ void InitAllowedProto3Extendee() {
allowed_proto3_extendees_->insert("google.protobuf.EnumValueOptions");
allowed_proto3_extendees_->insert("google.protobuf.ServiceOptions");
allowed_proto3_extendees_->insert("google.protobuf.MethodOptions");
+ google::protobuf::internal::OnShutdown(&DeleteAllowedProto3Extendee);
}
// Checks whether the extendee type is allowed in proto3.
diff --git a/src/google/protobuf/map_entry.h b/src/google/protobuf/map_entry.h
index 6971c763..4d3fcfb6 100644
--- a/src/google/protobuf/map_entry.h
+++ b/src/google/protobuf/map_entry.h
@@ -43,6 +43,10 @@ class Arena;
namespace protobuf {
namespace internal {
+// Register all MapEntry default instances so we can delete them in
+// ShutdownProtobufLibrary().
+void RegisterMapEntryDefaultInstance(MessageLite* default_instance);
+
// This is the common base class for MapEntry. It is used by MapFieldBase in
// reflection api, in which the static type of key and value is unknown.
class LIBPROTOBUF_EXPORT MapEntryBase : public Message {
@@ -317,6 +321,7 @@ class LIBPROTOBUF_EXPORT MapEntry : public MapEntryBase {
entry->reflection_ = reflection;
entry->default_instance_ = entry;
entry->InitAsDefaultInstance();
+ RegisterMapEntryDefaultInstance(entry);
return entry;
}
diff --git a/src/google/protobuf/map_field.cc b/src/google/protobuf/map_field.cc
index 74431628..b535ec28 100644
--- a/src/google/protobuf/map_field.cc
+++ b/src/google/protobuf/map_field.cc
@@ -30,10 +30,37 @@
#include <google/protobuf/map_field.h>
+#include <vector>
+
namespace google {
namespace protobuf {
namespace internal {
+ProtobufOnceType map_entry_default_instances_once_;
+Mutex* map_entry_default_instances_mutex_;
+vector<MessageLite*>* map_entry_default_instances_;
+
+void DeleteMapEntryDefaultInstances() {
+ for (int i = 0; i < map_entry_default_instances_->size(); ++i) {
+ delete map_entry_default_instances_->at(i);
+ }
+ delete map_entry_default_instances_mutex_;
+ delete map_entry_default_instances_;
+}
+
+void InitMapEntryDefaultInstances() {
+ map_entry_default_instances_mutex_ = new Mutex();
+ map_entry_default_instances_ = new vector<MessageLite*>();
+ OnShutdown(&DeleteMapEntryDefaultInstances);
+}
+
+void RegisterMapEntryDefaultInstance(MessageLite* default_instance) {
+ GoogleOnceInit(&map_entry_default_instances_once_,
+ &InitMapEntryDefaultInstances);
+ MutexLock lock(map_entry_default_instances_mutex_);
+ map_entry_default_instances_->push_back(default_instance);
+}
+
MapFieldBase::~MapFieldBase() {
if (repeated_field_ != NULL) delete repeated_field_;
}