You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stdcxx.apache.org by se...@apache.org on 2008/11/09 01:45:30 UTC
svn commit: r712454 - /stdcxx/branches/4.2.x/src/locale_body.cpp
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 <se...@apache.org>
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