https://gcc.gnu.org/g:351ac78e48fa897080cf8bbb71618df9c428ad30

commit r13-9643-g351ac78e48fa897080cf8bbb71618df9c428ad30
Author: Richard Biener <rguent...@suse.de>
Date:   Mon Nov 6 11:31:40 2023 +0100

    libstdc++/112351 - deal with __gthread_once failure during locale init
    
    The following makes the C++98 locale init path follow the way the
    C++11 performs initialization.  This way we deal with pthread_once
    failing, falling back to non-threadsafe initialization which, given we
    initialize from the library, should be serialized by the dynamic
    loader already.
    
            PR libstdc++/112351
    libstdc++-v3/
            * src/c++98/locale.cc (locale::facet::_S_initialize_once):
            Check whether _S_c_locale is already initialized.
            (locale::facet::_S_get_c_locale): Always perform non-threadsafe
            init when threadsafe init failed.
    
    (cherry picked from commit 7562f089a190953b8ef615b90b7b0520e812a930)

Diff:
---
 libstdc++-v3/src/c++98/locale.cc | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/libstdc++-v3/src/c++98/locale.cc b/libstdc++-v3/src/c++98/locale.cc
index d308140bab7d..1ef0c394cd73 100644
--- a/libstdc++-v3/src/c++98/locale.cc
+++ b/libstdc++-v3/src/c++98/locale.cc
@@ -206,6 +206,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
   void
   locale::facet::_S_initialize_once()
   {
+    // Need to check this because we could get called once from
+    // _S_get_c_locale() when the program is single-threaded, and then again
+    // (via __gthread_once) when it's multi-threaded.
+    if (_S_c_locale)
+      return;
+
     // Initialize the underlying locale model.
     _S_create_c_locale(_S_c_locale, _S_c_name);
   }
@@ -216,12 +222,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 #ifdef __GTHREADS
     if (__gthread_active_p())
       __gthread_once(&_S_once, _S_initialize_once);
-    else
 #endif
-      {
-       if (!_S_c_locale)
-         _S_initialize_once();
-      }
+    if (__builtin_expect (!_S_c_locale, 0))
+      _S_initialize_once();
     return _S_c_locale;
   }

Reply via email to