1*6777b538SAndroid Build Coastguard Workerdiff --git a/src/google/protobuf/generated_message_util.cc b/src/google/protobuf/generated_message_util.cc 2*6777b538SAndroid Build Coastguard Workerindex 05a228fb8fe6a..c055640d56214 100644 3*6777b538SAndroid Build Coastguard Worker--- a/src/google/protobuf/generated_message_util.cc 4*6777b538SAndroid Build Coastguard Worker+++ b/src/google/protobuf/generated_message_util.cc 5*6777b538SAndroid Build Coastguard Worker@@ -69,25 +69,16 @@ PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT 6*6777b538SAndroid Build Coastguard Worker fixed_address_empty_string{}; // NOLINT 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker 9*6777b538SAndroid Build Coastguard Worker-PROTOBUF_CONSTINIT std::atomic<bool> init_protobuf_defaults_state{false}; 10*6777b538SAndroid Build Coastguard Worker-static bool InitProtobufDefaultsImpl() { 11*6777b538SAndroid Build Coastguard Worker- fixed_address_empty_string.DefaultConstruct(); 12*6777b538SAndroid Build Coastguard Worker- OnShutdownDestroyString(fixed_address_empty_string.get_mutable()); 13*6777b538SAndroid Build Coastguard Worker- 14*6777b538SAndroid Build Coastguard Worker- 15*6777b538SAndroid Build Coastguard Worker- init_protobuf_defaults_state.store(true, std::memory_order_release); 16*6777b538SAndroid Build Coastguard Worker- return true; 17*6777b538SAndroid Build Coastguard Worker-} 18*6777b538SAndroid Build Coastguard Worker- 19*6777b538SAndroid Build Coastguard Worker+PROTOBUF_CONSTINIT bool init_protobuf_defaults_state{false}; 20*6777b538SAndroid Build Coastguard Worker void InitProtobufDefaultsSlow() { 21*6777b538SAndroid Build Coastguard Worker- static bool is_inited = InitProtobufDefaultsImpl(); 22*6777b538SAndroid Build Coastguard Worker- (void)is_inited; 23*6777b538SAndroid Build Coastguard Worker+ fixed_address_empty_string.DefaultConstruct(); 24*6777b538SAndroid Build Coastguard Worker+ init_protobuf_defaults_state = true; 25*6777b538SAndroid Build Coastguard Worker } 26*6777b538SAndroid Build Coastguard Worker // Force the initialization of the empty string. 27*6777b538SAndroid Build Coastguard Worker // Normally, registration would do it, but we don't have any guarantee that 28*6777b538SAndroid Build Coastguard Worker // there is any object with reflection. 29*6777b538SAndroid Build Coastguard Worker PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 static std::true_type init_empty_string = 30*6777b538SAndroid Build Coastguard Worker- (InitProtobufDefaultsSlow(), std::true_type{}); 31*6777b538SAndroid Build Coastguard Worker+ (InitProtobufDefaults(), std::true_type{}); 32*6777b538SAndroid Build Coastguard Worker 33*6777b538SAndroid Build Coastguard Worker const std::string& GetEmptyString() { 34*6777b538SAndroid Build Coastguard Worker InitProtobufDefaults(); 35*6777b538SAndroid Build Coastguard Workerdiff --git a/src/google/protobuf/generated_message_util.h b/src/google/protobuf/generated_message_util.h 36*6777b538SAndroid Build Coastguard Workerindex 0aee548ed2796..a722c9126026d 100644 37*6777b538SAndroid Build Coastguard Worker--- a/src/google/protobuf/generated_message_util.h 38*6777b538SAndroid Build Coastguard Worker+++ b/src/google/protobuf/generated_message_util.h 39*6777b538SAndroid Build Coastguard Worker@@ -89,11 +89,14 @@ inline To DownCast(From& f) { 40*6777b538SAndroid Build Coastguard Worker // This fastpath inlines a single branch instead of having to make the 41*6777b538SAndroid Build Coastguard Worker // InitProtobufDefaults function call. 42*6777b538SAndroid Build Coastguard Worker // It also generates less inlined code than a function-scope static initializer. 43*6777b538SAndroid Build Coastguard Worker-PROTOBUF_EXPORT extern std::atomic<bool> init_protobuf_defaults_state; 44*6777b538SAndroid Build Coastguard Worker+PROTOBUF_EXPORT extern bool init_protobuf_defaults_state; 45*6777b538SAndroid Build Coastguard Worker PROTOBUF_EXPORT void InitProtobufDefaultsSlow(); 46*6777b538SAndroid Build Coastguard Worker PROTOBUF_EXPORT inline void InitProtobufDefaults() { 47*6777b538SAndroid Build Coastguard Worker- if (PROTOBUF_PREDICT_FALSE( 48*6777b538SAndroid Build Coastguard Worker- !init_protobuf_defaults_state.load(std::memory_order_acquire))) { 49*6777b538SAndroid Build Coastguard Worker+ // This is not thread-safe, but is called within a static initializer. As long 50*6777b538SAndroid Build Coastguard Worker+ // as there are no calls to this function from off the main thread, before 51*6777b538SAndroid Build Coastguard Worker+ // main() starts, this is safe. After main() starts, 52*6777b538SAndroid Build Coastguard Worker+ // init_protobuf_defaults_state will always be true. 53*6777b538SAndroid Build Coastguard Worker+ if (PROTOBUF_PREDICT_FALSE(!init_protobuf_defaults_state)) { 54*6777b538SAndroid Build Coastguard Worker InitProtobufDefaultsSlow(); 55*6777b538SAndroid Build Coastguard Worker } 56*6777b538SAndroid Build Coastguard Worker } 57*6777b538SAndroid Build Coastguard Worker-- 58*6777b538SAndroid Build Coastguard Worker2.37.0.rc0.104.g0611611a94-goog 59