Author: sebor
Date: Sat Nov  8 16:45:30 2008
New Revision: 712454

URL: http://svn.apache.org/viewvc?rev=712454&view=rev
Log:
2008-11-08  Martin Sebor  <[EMAIL PROTECTED]>

        STDCXX-914
        * src/locale_body (__rw_locale::_C_manage): Optimized the detection
        and "destruction" of the classic C locale.
        (__rw_locale::_C_is_managed): Optimized the detection of the same.

Modified:
    stdcxx/branches/4.2.x/src/locale_body.cpp

Modified: stdcxx/branches/4.2.x/src/locale_body.cpp
URL: 
http://svn.apache.org/viewvc/stdcxx/branches/4.2.x/src/locale_body.cpp?rev=712454&r1=712453&r2=712454&view=diff
==============================================================================
--- stdcxx/branches/4.2.x/src/locale_body.cpp (original)
+++ stdcxx/branches/4.2.x/src/locale_body.cpp Sat Nov  8 16:45:30 2008
@@ -859,6 +859,21 @@
         return tmp;
     }
 
+    if (plocale && plocale == classic) {
+        // optimize the "destruction" of the classic C locale
+        // the object is never destroyed and its reference count
+        // never drops to 0
+        _RWSTD_ASSERT (__rw_is_C (locname));
+        _RWSTD_ASSERT (__rw_is_C (plocale->_C_name));
+
+        const size_t ref =
+            _RWSTD_ATOMIC_PREDECREMENT (plocale->_C_ref, false);
+
+        _RWSTD_ASSERT (ref + 1U != 0);
+        _RWSTD_UNUSED (ref);
+
+        return 0;
+    }
 
     // re-entrant to protect static local data structures
     // (not the locales themselves)
@@ -1066,6 +1081,15 @@
             return false;
         }
 
+        _RWSTD_ASSERT (0 == _C_usr_facets);
+
+        if (_C_all == _C_std_facet_bits && 0 == _C_byname_facet_bits) {
+            // optimized for the C locale
+            _RWSTD_ASSERT (__rw_is_C (_C_name));
+
+            return true;
+        }
+
         // unless all facets in the same category come either from
         // the C locale or from some named locale the locale object
         // containing the facets is not managed (this test doesn't


Reply via email to