@ -479,15 +479,8 @@ typedef std::map<DescriptorIntPair, const FieldDescriptor*>
ExtensionsGroupedByDescriptorMap ;
typedef HASH_MAP < string , const SourceCodeInfo_Location * > LocationsByPathMap ;
std : : 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 std : : set < string > ;
std : : set < string > * NewAllowedProto3Extendee ( ) {
auto allowed_proto3_extendees = new std : : set < string > ;
const char * kOptionNames [ ] = {
" FileOptions " , " MessageOptions " , " FieldOptions " , " EnumOptions " ,
" EnumValueOptions " , " ServiceOptions " , " MethodOptions " , " OneofOptions " } ;
@ -495,14 +488,13 @@ void InitAllowedProto3Extendee() {
// descriptor.proto has a different package name in opensource. We allow
// both so the opensource protocol compiler can also compile internal
// proto3 files with custom options. See: b/27567912
allowed_proto3_extendees_ - > insert ( string ( " google.protobuf. " ) +
allowed_proto3_extendees - > insert ( string ( " google.protobuf. " ) +
kOptionNames [ i ] ) ;
// Split the word to trick the opensource processing scripts so they
// will keep the origial package name.
allowed_proto3_extendees_ - > insert ( string ( " proto " ) + " 2. " + kOptionNames [ i ] ) ;
allowed_proto3_extendees - > insert ( string ( " proto " ) + " 2. " + kOptionNames [ i ] ) ;
}
google : : protobuf : : internal : : OnShutdown ( & DeleteAllowedProto3Extendee ) ;
return allowed_proto3_extendees ;
}
// Checks whether the extendee type is allowed in proto3.
@ -510,9 +502,10 @@ void InitAllowedProto3Extendee() {
// instead of comparing the descriptor directly because the extensions may be
// defined in a different pool.
bool AllowedExtendeeInProto3 ( const string & name ) {
: : google : : protobuf : : GoogleOnceInit ( & allowed_proto3_extendees_init_ , & InitAllowedProto3Extendee ) ;
return allowed_proto3_extendees_ - > find ( name ) ! =
allowed_proto3_extendees_ - > end ( ) ;
static auto allowed_proto3_extendees =
internal : : OnShutdownDelete ( NewAllowedProto3Extendee ( ) ) ;
return allowed_proto3_extendees - > find ( name ) ! =
allowed_proto3_extendees - > end ( ) ;
}
} // anonymous namespace
@ -829,31 +822,10 @@ 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 ( ) {
InitFileDescriptorTablesOnce ( ) ;
return * file_descriptor_tables_ ;
static auto file_descriptor_tables =
internal : : OnShutdownDelete ( new FileDescriptorTables ( ) ) ;
return * file_descriptor_tables ;
}
void DescriptorPool : : Tables : : AddCheckpoint ( ) {
@ -1335,42 +1307,28 @@ bool DescriptorPool::InternalIsFileLoaded(const string& filename) const {
namespace {
EncodedDescriptorDatabase * generated_database_ = NULL ;
DescriptorPool * generated_pool_ = NULL ;
GOOGLE_PROTOBUF_DECLARE_ONCE ( generated_pool_init_ ) ;
void DeleteGeneratedPool ( ) {
delete generated_database_ ;
generated_database_ = NULL ;
delete generated_pool_ ;
generated_pool_ = NULL ;
}
static void InitGeneratedPool ( ) {
generated_database_ = new EncodedDescriptorDatabase ;
generated_pool_ = new DescriptorPool ( generated_database_ ) ;
generated_pool_ - > InternalSetLazilyBuildDependencies ( ) ;
internal : : OnShutdown ( & DeleteGeneratedPool ) ;
EncodedDescriptorDatabase * GeneratedDatabase ( ) {
static auto generated_database =
internal : : OnShutdownDelete ( new EncodedDescriptorDatabase ( ) ) ;
return generated_database ;
}
inline void InitGeneratedPoolOnce ( ) {
: : google : : protobuf : : GoogleOnceInit ( & generated_pool_init_ , & InitGeneratedPool ) ;
DescriptorPool * NewGeneratedPool ( ) {
auto generated_pool = new DescriptorPool ( GeneratedDatabase ( ) ) ;
generated_pool - > InternalSetLazilyBuildDependencies ( ) ;
return generated_pool ;
}
} // anonymous namespace
const DescriptorPool * DescriptorPool : : generated_pool ( ) {
InitGeneratedPoolOnce ( ) ;
return generated_pool_ ;
DescriptorPool * DescriptorPool : : internal_generated_pool ( ) {
static DescriptorPool * generated_pool =
internal : : OnShutdownDelete ( NewGeneratedPool ( ) ) ;
return generated_pool ;
}
DescriptorPool * DescriptorPool : : internal_generated_pool ( ) {
InitGeneratedPoolOnce ( ) ;
return generated_pool_ ;
const DescriptorPool * DescriptorPool : : generated_pool ( ) {
return internal_generated_pool ( ) ;
}
void DescriptorPool : : InternalAddGeneratedFile (
@ -1397,8 +1355,7 @@ void DescriptorPool::InternalAddGeneratedFile(
// Therefore, when we parse one, we have to be very careful to avoid using
// any descriptor-based operations, since this might cause infinite recursion
// or deadlock.
InitGeneratedPoolOnce ( ) ;
GOOGLE_CHECK ( generated_database_ - > Add ( encoded_file_descriptor , size ) ) ;
GOOGLE_CHECK ( GeneratedDatabase ( ) - > Add ( encoded_file_descriptor , size ) ) ;
}