Commit 6e52332e by Benjamin Kosnik Committed by Benjamin Kosnik

re PR libstdc++/7445 (poor performance of std::locale::classic() in multi-threaded applications)


2002-08-15  Benjamin Kosnik  <bkoz@redhat.com>

	* include/ext/stdio_filebuf.h (stdio_filebuf): Explicitly set
	_M_buf_size_opt to zero when unbuffering.
	* include/bits/fstream.tcc (filebuf::showmanyc): Simplify.
	Consistency checks for _M_buf_size_opt.

	Revert PR libstdc++/7445
	* src/locale.cc (locale::classic): Revert.

	* docs/html/17_intro/TODO: Add.

From-SVN: r56365
parent 204250d2
2002-08-15 Benjamin Kosnik <bkoz@redhat.com>
* include/ext/stdio_filebuf.h (stdio_filebuf): Explicitly set
_M_buf_size_opt to zero when unbuffering.
* include/bits/fstream.tcc (filebuf::showmanyc): Simplify.
Consistency checks for _M_buf_size_opt.
Revert PR libstdc++/7445
* src/locale.cc (locale::classic): Revert.
* docs/html/17_intro/TODO: Add.
2002-08-15 Phil Edwards <pme@gcc.gnu.org> 2002-08-15 Phil Edwards <pme@gcc.gnu.org>
* docs/html/documentation.html: Update doxygen links for 3.2. * docs/html/documentation.html: Update doxygen links for 3.2.
......
...@@ -17,7 +17,16 @@ executable speed. ...@@ -17,7 +17,16 @@ executable speed.
- benchmarking addition to the testsuite that does the above. - benchmarking addition to the testsuite that does the above.
- implement symbol versioning for ELF targets. - implement testing for symbol versioning for ELF targets.
- review streambuf, filebuf, stringbuf to optimize data member
placement. Do pback bits need to be in streambuf? How about
_M_set_indeterminate, etc?
- Think about naming all member data and member functions consistently
as per
funtions: _M_verb_adverb
data: _M_noun_adjective
- exception specifications need to be reviewed for all parts of the - exception specifications need to be reviewed for all parts of the
library support and utility areas, particularly <new>. library support and utility areas, particularly <new>.
......
...@@ -90,9 +90,8 @@ namespace std ...@@ -90,9 +90,8 @@ namespace std
{ {
_M_allocate_internal_buffer(); _M_allocate_internal_buffer();
_M_mode = __mode; _M_mode = __mode;
// For time being, set both (in/out) sets of pointers.
_M_set_indeterminate(); _M_set_indeterminate();
if ((__mode & ios_base::ate) if ((__mode & ios_base::ate)
&& this->seekoff(0, ios_base::end, __mode) < 0) && this->seekoff(0, ios_base::end, __mode) < 0)
this->close(); this->close();
...@@ -147,12 +146,7 @@ namespace std ...@@ -147,12 +146,7 @@ namespace std
bool __testin = _M_mode & ios_base::in; bool __testin = _M_mode & ios_base::in;
if (__testin && this->is_open()) if (__testin && this->is_open())
{ __ret = _M_in_end - _M_in_cur;
if (_M_in_cur < _M_in_end)
__ret = _M_in_end - _M_in_cur;
else
__ret = 0;
}
_M_last_overflowed = false; _M_last_overflowed = false;
return __ret; return __ret;
} }
...@@ -316,7 +310,7 @@ namespace std ...@@ -316,7 +310,7 @@ namespace std
{ {
int_type __ret = traits_type::eof(); int_type __ret = traits_type::eof();
bool __testput = _M_out_cur && _M_out_beg < _M_out_end; bool __testput = _M_out_cur && _M_out_beg < _M_out_end;
bool __testunbuffered = _M_file.is_open() && !_M_buf_size; bool __testunbuffered = _M_file.is_open() && !_M_buf_size_opt;
if (__testput || __testunbuffered) if (__testput || __testunbuffered)
{ {
......
...@@ -123,16 +123,18 @@ namespace __gnu_cxx ...@@ -123,16 +123,18 @@ namespace __gnu_cxx
if (this->is_open()) if (this->is_open())
{ {
_M_mode = __mode; _M_mode = __mode;
_M_buf_size_opt = __size;
if (__size > 0 && __size < 4) if (__size > 0 && __size < 4)
{ {
// Specify unbuffered.
_M_buf = _M_unbuf; _M_buf = _M_unbuf;
_M_buf_size = __size; _M_buf_size = __size;
_M_buf_size_opt = 0;
} }
else else
_M_allocate_internal_buffer(); {
_M_buf_size_opt = __size;
_M_allocate_internal_buffer();
}
_M_set_indeterminate(); _M_set_indeterminate();
} }
} }
...@@ -146,16 +148,18 @@ namespace __gnu_cxx ...@@ -146,16 +148,18 @@ namespace __gnu_cxx
if (this->is_open()) if (this->is_open())
{ {
_M_mode = __mode; _M_mode = __mode;
_M_buf_size_opt = __size;
if (__size > 0 && __size < 4) if (__size > 0 && __size < 4)
{ {
// Specify unbuffered.
_M_buf = _M_unbuf; _M_buf = _M_unbuf;
_M_buf_size = __size; _M_buf_size = __size;
_M_buf_size_opt = 0;
} }
else else
_M_allocate_internal_buffer(); {
_M_buf_size_opt = __size;
_M_allocate_internal_buffer();
}
_M_set_indeterminate(); _M_set_indeterminate();
} }
} }
......
...@@ -284,11 +284,11 @@ namespace std ...@@ -284,11 +284,11 @@ namespace std
const locale& const locale&
locale::classic() locale::classic()
{ {
static _STL_mutex_lock __lock __STL_MUTEX_INITIALIZER;
_STL_auto_lock __auto(__lock);
if (!_S_classic) if (!_S_classic)
{ {
static _STL_mutex_lock __lock __STL_MUTEX_INITIALIZER;
_STL_auto_lock __auto(__lock);
try try
{ {
// 26 Standard facets, 2 references. // 26 Standard facets, 2 references.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment