This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
| Other format: | [Raw text] | |
Hi, This patch attempts to make locale initialization threadsafe, by using static initialization when possible (locale::facet::_S_c_name) and initializing other members through __gthread_once (locale::_S_classic and locale::facet::_S_c_locale). Also, statics that are initialized statically (locale::_S_categories, locale::facet::_S_c_name) are declared const. This is needed so that locale can be initialized at any time during program execution, and so that facets can be constructed before locale::classic() is called. This means that locale no longer depends on iostreams being initialized at the beginning of the program. Note that locale::global() and locale::locale() are still thread-unsafe. Tested on i686-pc-linux-gnu. Petur 2003-09-30 Petur Runolfsson <peturr02@ru.is> * config/locale/generic/c_locale.cc (category_names, locale::_S_categories): Const qualify. * config/locale/gnu/c_locale.cc: Same. * config/locale/generic/time_members.h (__timepunct::__timepunct): Copy string contents before assigning to _M_name_timepunct, qualify strcpy and strlen with std::. * config/locale/gnu/time_members.h: Same. * config/locale/gnu/messages_members.h (messages::messages): Copy string contents before assigning to _M_name_messages, qualify strcpy and strlen with std::. * config/os/gnu-linux/ctype_noninline.h (ctype<char>::classic_table()): Don't call locale::classic(). * include/bits/locale_classes.h (locale::_S_categories): Const qualify. (locale::_S_once_mt, locale::_S_init, locale::facet::_S_once_mt, locale::facet::_S_initialized, locale::facet::_S_init, locale::facet::_S_get_c_locale): Declare. (locale::_S_initialize): Don't define. (locale::facet::_S_c_locale): Make private. (locale::facet::_S_c_name): Const qualify. (locale::_Impl::_Impl(facet**, size_t, bool)): Drop unused parameters, add throw() specifier. * include/bits/locale_facets.h (__timepunct::_M_name_timepunct, messages::_M_name_messages): Const qualify. * src/locale.cc (locale::_S_once_mt, locale::facet::_S_once_mt, locale::facet::_S_initialized): Define. (locale::classic): Move initialization code... (locale::_S_init): ...here. (locale::_S_initialize): Call _S_init through __gthread_once. (locale::facet::_S_init): Initialize _S_c_locale. (locale::facet::_S_get_c_locale): Call _S_init through __gthread_once before returning _S_c_locale. * src/localename.cc (locale::_Impl::_Impl(facet**, size_t, bool)): Drop unused parameters, add throw() specifier, don't initialize locale::facet::_S_c_locale and _S_c_name. * config/locale/generic/messages_members.h: Replace _S_c_locale with _S_get_c_locale(). * config/locale/gnu/c_locale.cc: Same. * config/locale/gnu/messages_members.h: Same. * config/locale/gnu/numeric_members.cc: Same. * config/locale/gnu/time_members.cc: Same. * config/os/gnu-linux/ctype_noninline.h: Same. * include/bits/locale_facets.h: Same. * include/bits/locale_facets.tcc: Same. * src/codecvt.cc: Same. * src/ctype.cc: Same.
Attachment:
locale-init.diff
Description: locale-init.diff
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |