mirror of git://gcc.gnu.org/git/gcc.git
localefwd.h: Format.
2001-07-03 Benjamin Kosnik <bkoz@redhat.com> * include/bits/localefwd.h: Format. * include/bits/locale_facts.tcc (locale::combine): Adjust. * src/locale.cc (locale::locale::(_Impl)): Don't call _M_add_reference. (locale::facet::_M_remove_reference): Simplify. * src/globals.cc (locale_impl_c): New. Format. (locale_c): New. * src/ios.cc (ios_base::Init::Init): Increment _S_ios_base_init last. From-SVN: r43747
This commit is contained in:
parent
ec97333e09
commit
1f46fc8e90
|
|
@ -1,3 +1,14 @@
|
||||||
|
2001-07-03 Benjamin Kosnik <bkoz@redhat.com>
|
||||||
|
|
||||||
|
* include/bits/localefwd.h: Format.
|
||||||
|
* include/bits/locale_facts.tcc (locale::combine): Adjust.
|
||||||
|
* src/locale.cc (locale::locale::(_Impl)): Don't call
|
||||||
|
_M_add_reference.
|
||||||
|
(locale::facet::_M_remove_reference): Simplify.
|
||||||
|
* src/globals.cc (locale_impl_c): New. Format.
|
||||||
|
(locale_c): New.
|
||||||
|
* src/ios.cc (ios_base::Init::Init): Increment _S_ios_base_init last.
|
||||||
|
|
||||||
2001-07-02 Loren J. Rittle <ljrittle@acm.org>
|
2001-07-02 Loren J. Rittle <ljrittle@acm.org>
|
||||||
|
|
||||||
* acinclude.m4 (GLIBCPP_ENABLE_THREADS): Protect variable from shell
|
* acinclude.m4 (GLIBCPP_ENABLE_THREADS): Protect variable from shell
|
||||||
|
|
|
||||||
|
|
@ -48,7 +48,7 @@ namespace std
|
||||||
locale
|
locale
|
||||||
locale::combine(const locale& __other)
|
locale::combine(const locale& __other)
|
||||||
{
|
{
|
||||||
_Impl* __tmp = new _Impl(*_M_impl, 0);
|
_Impl* __tmp = new _Impl(*_M_impl, 1);
|
||||||
__tmp->_M_replace_facet(__other._M_impl, &_Facet::id);
|
__tmp->_M_replace_facet(__other._M_impl, &_Facet::id);
|
||||||
return locale(__tmp);
|
return locale(__tmp);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -451,9 +451,4 @@ namespace std
|
||||||
has_facet(const locale& __loc) throw();
|
has_facet(const locale& __loc) throw();
|
||||||
} // namespace std
|
} // namespace std
|
||||||
|
|
||||||
#endif /* _CPP_BITS_LOCCORE_H */
|
#endif
|
||||||
|
|
||||||
// Local Variables:
|
|
||||||
// mode:c++
|
|
||||||
// End:
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -44,6 +44,17 @@
|
||||||
// allocate the actual file buffers in this file.
|
// allocate the actual file buffers in this file.
|
||||||
namespace std
|
namespace std
|
||||||
{
|
{
|
||||||
|
// Standard "C" locale.
|
||||||
|
typedef char fake_locale_Impl[sizeof(locale::_Impl)]
|
||||||
|
__attribute__ ((aligned(__alignof__(locale::_Impl))));
|
||||||
|
fake_locale_Impl locale_impl_c;
|
||||||
|
|
||||||
|
typedef char fake_locale[sizeof(locale)]
|
||||||
|
__attribute__ ((aligned(__alignof__(locale))));
|
||||||
|
fake_locale locale_c;
|
||||||
|
|
||||||
|
|
||||||
|
// Standard stream objects.
|
||||||
typedef char fake_istream[sizeof(istream)]
|
typedef char fake_istream[sizeof(istream)]
|
||||||
__attribute__ ((aligned(__alignof__(istream))));
|
__attribute__ ((aligned(__alignof__(istream))));
|
||||||
typedef char fake_ostream[sizeof(ostream)]
|
typedef char fake_ostream[sizeof(ostream)]
|
||||||
|
|
@ -76,30 +87,28 @@ namespace std
|
||||||
fake_wfilebuf buf_wcerr;
|
fake_wfilebuf buf_wcerr;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Globals for once-only runtime initialization of mutex objects. This
|
|
||||||
// allows static initialization of these objects on systems that need a
|
// Globals for once-only runtime initialization of mutex objects. This
|
||||||
// function call to initialize a mutex. For example, see stl_threads.h.
|
// allows static initialization of these objects on systems that need a
|
||||||
|
// function call to initialize a mutex. For example, see stl_threads.h.
|
||||||
#if __GTHREADS
|
#if __GTHREADS
|
||||||
#ifdef __GTHREAD_MUTEX_INIT
|
#ifdef __GTHREAD_MUTEX_INIT
|
||||||
// This path is not needed since static initialization of mutexs works
|
// This path is not needed since static initialization of mutexs works
|
||||||
// on this platform.
|
// on this platform.
|
||||||
#elif defined(__GTHREAD_MUTEX_INIT_FUNCTION)
|
#elif defined(__GTHREAD_MUTEX_INIT_FUNCTION)
|
||||||
__gthread_once_t _GLIBCPP_once = __GTHREAD_ONCE_INIT;
|
__gthread_once_t _GLIBCPP_once = __GTHREAD_ONCE_INIT;
|
||||||
__gthread_mutex_t _GLIBCPP_mutex;
|
__gthread_mutex_t _GLIBCPP_mutex;
|
||||||
__gthread_mutex_t *_GLIBCPP_mutex_address;
|
__gthread_mutex_t *_GLIBCPP_mutex_address;
|
||||||
|
|
||||||
// Once-only initializer function for _GLIBCPP_mutex.
|
// Once-only initializer function for _GLIBCPP_mutex.
|
||||||
void
|
void
|
||||||
_GLIBCPP_mutex_init ()
|
_GLIBCPP_mutex_init ()
|
||||||
{
|
{ __GTHREAD_MUTEX_INIT_FUNCTION (&_GLIBCPP_mutex); }
|
||||||
__GTHREAD_MUTEX_INIT_FUNCTION (&_GLIBCPP_mutex);
|
|
||||||
}
|
// Once-only initializer function for _GLIBCPP_mutex_address.
|
||||||
// Once-only initializer function for _GLIBCPP_mutex_address.
|
void
|
||||||
void
|
_GLIBCPP_mutex_address_init ()
|
||||||
_GLIBCPP_mutex_address_init ()
|
{ __GTHREAD_MUTEX_INIT_FUNCTION (_GLIBCPP_mutex_address); }
|
||||||
{
|
|
||||||
__GTHREAD_MUTEX_INIT_FUNCTION (_GLIBCPP_mutex_address);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
|
#endif // __GTHREADS
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -205,12 +205,13 @@ namespace std
|
||||||
|
|
||||||
ios_base::Init::Init()
|
ios_base::Init::Init()
|
||||||
{
|
{
|
||||||
if (++_S_ios_base_init == 1)
|
if (_S_ios_base_init == 0)
|
||||||
{
|
{
|
||||||
// Standard streams default to synced with "C" operations.
|
// Standard streams default to synced with "C" operations.
|
||||||
ios_base::Init::_S_synced_with_stdio = true;
|
ios_base::Init::_S_synced_with_stdio = true;
|
||||||
_S_ios_create(ios_base::Init::_S_synced_with_stdio);
|
_S_ios_create(ios_base::Init::_S_synced_with_stdio);
|
||||||
}
|
}
|
||||||
|
++_S_ios_base_init;
|
||||||
}
|
}
|
||||||
|
|
||||||
ios_base::Init::~Init()
|
ios_base::Init::~Init()
|
||||||
|
|
|
||||||
|
|
@ -43,6 +43,10 @@
|
||||||
|
|
||||||
namespace std
|
namespace std
|
||||||
{
|
{
|
||||||
|
// Defined in globals.cc.
|
||||||
|
extern locale::_Impl locale_impl_c;
|
||||||
|
extern locale locale_c;
|
||||||
|
|
||||||
// Definitions for static const data members of locale.
|
// Definitions for static const data members of locale.
|
||||||
const locale::category locale::none;
|
const locale::category locale::none;
|
||||||
const locale::category locale::ctype;
|
const locale::category locale::ctype;
|
||||||
|
|
@ -362,10 +366,10 @@ namespace std
|
||||||
locale::locale(const locale& __other) throw()
|
locale::locale(const locale& __other) throw()
|
||||||
{ (_M_impl = __other._M_impl)->_M_add_reference(); }
|
{ (_M_impl = __other._M_impl)->_M_add_reference(); }
|
||||||
|
|
||||||
// This is used to initialize global and classic locales.
|
// This is used to initialize global and classic locales, and
|
||||||
locale::locale(_Impl* __ip) throw()
|
// assumes that the _Impl objects are constructed correctly.
|
||||||
: _M_impl(__ip)
|
locale::locale(_Impl* __ip) throw() : _M_impl(__ip)
|
||||||
{ __ip->_M_add_reference(); }
|
{ }
|
||||||
|
|
||||||
locale::locale(const char* __s)
|
locale::locale(const char* __s)
|
||||||
{
|
{
|
||||||
|
|
@ -415,13 +419,18 @@ namespace std
|
||||||
{
|
{
|
||||||
// XXX MT
|
// XXX MT
|
||||||
_S_initialize();
|
_S_initialize();
|
||||||
locale __old(_S_global);
|
_Impl* __old = _S_global;
|
||||||
__other._M_impl->_M_add_reference();
|
__other._M_impl->_M_add_reference();
|
||||||
_S_global->_M_remove_reference();
|
|
||||||
_S_global = __other._M_impl;
|
_S_global = __other._M_impl;
|
||||||
if (_S_global->_M_check_same_name() && _S_global->_M_names[0] != "*")
|
if (_S_global->_M_check_same_name() && _S_global->_M_names[0] != "*")
|
||||||
setlocale(LC_ALL, __other.name().c_str());
|
setlocale(LC_ALL, __other.name().c_str());
|
||||||
return __old;
|
|
||||||
|
// Reference count sanity check: one reference removed for the
|
||||||
|
// subsition of __other locale, one added by return-by-value. Net
|
||||||
|
// difference: zero. When the returned locale object's destrutor
|
||||||
|
// is called, then the reference count is decremented and possibly
|
||||||
|
// destroyed.
|
||||||
|
return locale(__old);
|
||||||
}
|
}
|
||||||
|
|
||||||
string
|
string
|
||||||
|
|
@ -446,7 +455,6 @@ namespace std
|
||||||
locale const&
|
locale const&
|
||||||
locale::classic()
|
locale::classic()
|
||||||
{
|
{
|
||||||
static locale* __classic_locale;
|
|
||||||
// XXX MT
|
// XXX MT
|
||||||
if (!_S_classic)
|
if (!_S_classic)
|
||||||
{
|
{
|
||||||
|
|
@ -454,26 +462,21 @@ namespace std
|
||||||
{
|
{
|
||||||
// 26 Standard facets, 2 references.
|
// 26 Standard facets, 2 references.
|
||||||
// One reference for _M_classic, one for _M_global
|
// One reference for _M_classic, one for _M_global
|
||||||
_S_classic = new _Impl("C", 2);
|
_S_classic = new (&locale_impl_c) _Impl("C", 2);
|
||||||
_S_global = _S_classic;
|
_S_global = _S_classic;
|
||||||
|
new (&locale_c) locale(_S_classic);
|
||||||
// Finesse static init order hassles
|
|
||||||
__classic_locale = new locale(_S_classic);
|
|
||||||
}
|
}
|
||||||
catch(...)
|
catch(...)
|
||||||
{
|
{
|
||||||
delete __classic_locale;
|
// Just call destructor, so that locale_impl_c's memory is
|
||||||
|
// not deallocated via a call to delete.
|
||||||
if (_S_classic)
|
if (_S_classic)
|
||||||
{
|
_S_classic->~_Impl();
|
||||||
_S_classic->_M_remove_reference();
|
|
||||||
_S_global->_M_remove_reference();
|
|
||||||
}
|
|
||||||
_S_classic = _S_global = 0;
|
_S_classic = _S_global = 0;
|
||||||
// XXX MT
|
|
||||||
__throw_exception_again;
|
__throw_exception_again;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return *__classic_locale;
|
return locale_c;
|
||||||
}
|
}
|
||||||
|
|
||||||
locale::category
|
locale::category
|
||||||
|
|
@ -518,8 +521,7 @@ namespace std
|
||||||
}
|
}
|
||||||
|
|
||||||
locale::facet::
|
locale::facet::
|
||||||
facet(size_t __refs) throw()
|
facet(size_t __refs) throw() : _M_references(__refs)
|
||||||
: _M_references(__refs)
|
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -531,12 +533,10 @@ namespace std
|
||||||
locale::facet::
|
locale::facet::
|
||||||
_M_remove_reference() throw()
|
_M_remove_reference() throw()
|
||||||
{
|
{
|
||||||
if (_M_references)
|
if (_M_references-- == 0)
|
||||||
--_M_references;
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{ delete this; } // XXX MT
|
{ delete this; }
|
||||||
catch (...)
|
catch (...)
|
||||||
{ }
|
{ }
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue