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