Add shutdown code for several newly introduced leaks;
Disable commandline interface test for heap check tests. Change-Id: I02aa2ad9704e3c70dcecae8b3b3557b18607d455
This commit is contained in:
parent
ff35de3ddd
commit
7a00a1e424
@ -64,6 +64,10 @@
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
|
||||
// Disable the whole test when we use tcmalloc for "draconian" heap checks, in
|
||||
// which case tcmalloc will print warnings that fail the plugin tests.
|
||||
#if !GOOGLE_PROTOBUF_HEAP_CHECK_DRACONIAN
|
||||
|
||||
namespace google {
|
||||
namespace protobuf {
|
||||
namespace compiler {
|
||||
@ -1663,3 +1667,5 @@ TEST_F(EncodeDecodeTest, ProtoParseError) {
|
||||
} // namespace compiler
|
||||
} // namespace protobuf
|
||||
} // namespace google
|
||||
|
||||
#endif // !GOOGLE_PROTOBUF_HEAP_CHECK_DRACONIAN
|
||||
|
@ -247,8 +247,14 @@ namespace {
|
||||
UnknownFieldSet* empty_unknown_field_set_ = NULL;
|
||||
GOOGLE_PROTOBUF_DECLARE_ONCE(empty_unknown_field_set_once_);
|
||||
|
||||
void DeleteEmptyUnknownFieldSet() {
|
||||
delete empty_unknown_field_set_;
|
||||
empty_unknown_field_set_ = NULL;
|
||||
}
|
||||
|
||||
void InitEmptyUnknownFieldSet() {
|
||||
empty_unknown_field_set_ = new UnknownFieldSet;
|
||||
internal::OnShutdown(&DeleteEmptyUnknownFieldSet);
|
||||
}
|
||||
|
||||
const UnknownFieldSet& GetEmptyUnknownFieldSet() {
|
||||
|
@ -440,6 +440,30 @@ const internal::RepeatedFieldAccessor* Reflection::RepeatedFieldAccessor(
|
||||
return NULL;
|
||||
}
|
||||
|
||||
namespace internal {
|
||||
namespace {
|
||||
void ShutdownRepeatedFieldAccessor() {
|
||||
Singleton<internal::RepeatedFieldPrimitiveAccessor<int32> >::ShutDown();
|
||||
Singleton<internal::RepeatedFieldPrimitiveAccessor<uint32> >::ShutDown();
|
||||
Singleton<internal::RepeatedFieldPrimitiveAccessor<int64> >::ShutDown();
|
||||
Singleton<internal::RepeatedFieldPrimitiveAccessor<uint64> >::ShutDown();
|
||||
Singleton<internal::RepeatedFieldPrimitiveAccessor<float> >::ShutDown();
|
||||
Singleton<internal::RepeatedFieldPrimitiveAccessor<double> >::ShutDown();
|
||||
Singleton<internal::RepeatedFieldPrimitiveAccessor<bool> >::ShutDown();
|
||||
Singleton<internal::RepeatedPtrFieldStringAccessor>::ShutDown();
|
||||
Singleton<internal::RepeatedPtrFieldMessageAccessor>::ShutDown();
|
||||
Singleton<internal::MapFieldAccessor>::ShutDown();
|
||||
};
|
||||
|
||||
struct ShutdownRepeatedFieldRegister {
|
||||
ShutdownRepeatedFieldRegister() {
|
||||
OnShutdown(&ShutdownRepeatedFieldAccessor);
|
||||
}
|
||||
} shutdown_;
|
||||
|
||||
} // namesapce
|
||||
} // namespace internal
|
||||
|
||||
namespace internal {
|
||||
// Macro defined in repeated_field.h. We can only define the Message-specific
|
||||
// GenericTypeHandler specializations here because we depend on Message, which
|
||||
|
@ -44,6 +44,10 @@ class Singleton {
|
||||
GoogleOnceInit(&once_, &Singleton<T>::Init);
|
||||
return instance_;
|
||||
}
|
||||
static void ShutDown() {
|
||||
delete instance_;
|
||||
instance_ = NULL;
|
||||
}
|
||||
private:
|
||||
static void Init() {
|
||||
instance_ = new T();
|
||||
@ -56,7 +60,7 @@ template<typename T>
|
||||
ProtobufOnceType Singleton<T>::once_;
|
||||
|
||||
template<typename T>
|
||||
T* Singleton<T>::instance_;
|
||||
T* Singleton<T>::instance_ = NULL;
|
||||
} // namespace internal
|
||||
} // namespace protobuf
|
||||
} // namespace google
|
||||
|
Loading…
Reference in New Issue
Block a user