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]

[PATCH] Threadsafe locale initialization


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]