Re: STDCXX-1056 [was: Re: STDCXX forks]

2012-09-17 Thread Stefan Teleman
On Mon, Sep 17, 2012 at 8:46 AM, Liviu Nicoara nikko...@hates.ms wrote:

 In the meantime I would like to stress again that __rw_get_numpunct is
 perfectly thread-safe and does not need extra locking for perfect
 forwarding.

So, by removing the test for

  if (!(_C_flags  _RW::__rw_gr))

(or any other bitmask for that matter), the functions which were
thread-unsafe - and were exhibiting all the symptoms of a run-time
race condition -, magically became thread-safe?

I have looked *extensively* at the code in __rw_get_numpunct. It is
inherently thread-unsafe.

--Stefan

-- 
Stefan Teleman
KDE e.V.
stefan.tele...@gmail.com


Re: STDCXX-1056 [was: Re: STDCXX forks]

2012-09-17 Thread Liviu Nicoara

On 09/17/12 09:51, Stefan Teleman wrote:

On Mon, Sep 17, 2012 at 8:46 AM, Liviu Nicoara nikko...@hates.ms wrote:


In the meantime I would like to stress again that __rw_get_numpunct is
perfectly thread-safe and does not need extra locking for perfect
forwarding.


So, by removing the test for

   if (!(_C_flags  _RW::__rw_gr))

(or any other bitmask for that matter), the functions which were
thread-unsafe - and were exhibiting all the symptoms of a run-time
race condition -, magically became thread-safe?

I have looked *extensively* at the code in __rw_get_numpunct. It is
inherently thread-unsafe.


I mean to say that no extra locking is necessary when the public interface 
forwards and no caching is done.

In more detail: __rw_get_numpunct code is entered upon a call from the 
protected virtual interface. It calls facet _C_data member function which 
either returns objects constructed from previously-initialized POD data (in 
which case no locking is necessary), or it attempts to first initialize the 
facet data from the STDCXX database.

If the latter, the execution goes in the facet data initialization code which 
is appropriately synchronized, see this stack trace:

(gdb) bt
#0  __rw::__rw_facet::_C_get_data (this=0x6e10a0) at 
srcdir/stdcxx/branches/4.2.x/src/facet.cpp:179
#1  0x0043788b in __rw::__rw_facet::_C_data (this=0x6e10a0) at 
srcdir/stdcxx/branches/4.2.x/include/loc/_facet.h:194
#2  0x0044874f in __rw::__rw_get_numpunct (pfacet=0x6e10a0, flags=4) at 
srcdir/stdcxx/branches/4.2.x/src/punct.cpp:80
#3  0x00449a14 in __rw::__rw_get_punct (pfacet=0x6e10a0, flags=4) at 
srcdir/stdcxx/branches/4.2.x/src/punct.cpp:578
#4  0x0041cecf in std::numpunctchar::do_grouping (this=0x6e10a0) at 
srcdir/stdcxx/branches/4.2.x/include/loc/_numpunct.h:99
#5  0x0041bd31 in std::numpunctchar::grouping (this=0x6e10a0) at 
srcdir/stdcxx/branches/4.2.x/include/loc/_numpunct.h:190
#6  0x004036b8 in main (argc=2, argv=0x7fffe018) at 
srcdir/stdcxx/branches/4.2.x/tests/localization/s.cpp:29
(gdb)

When the above fails, the facet data has not been initialized, e.g., when there 
is no STDCXX locale database, or the name of the locale does not refer to a 
locale in STDCXX database. The __rw_get_numpunct function will attempt next to 
use libc and system locales, via the __rw_setlocale class, which again is 
properly synchronized and the scope of that lock extends to cover the facet 
data initialization. See this stack trace:

(gdb) bt
#0  __rw::__rw_setlocale::__rw_setlocale (this=0x7fffdd30, locname=0x6e112a 
en_US.utf8, cat=6, nothrow=0) at 
srcdir/stdcxx/branches/4.2.x/src/setlocale.cpp:84
#1  0x00448974 in __rw::__rw_get_numpunct (pfacet=0x6e10a0, flags=4) at 
srcdir/stdcxx/branches/4.2.x/src/punct.cpp:134
#2  0x00449a14 in __rw::__rw_get_punct (pfacet=0x6e10a0, flags=4) at 
srcdir/stdcxx/branches/4.2.x/src/punct.cpp:578
#3  0x0041cecf in std::numpunctchar::do_grouping (this=0x6e10a0) at 
srcdir/stdcxx/branches/4.2.x/include/loc/_numpunct.h:99
#4  0x0041bd31 in std::numpunctchar::grouping (this=0x6e10a0) at 
srcdir/stdcxx/branches/4.2.x/include/loc/_numpunct.h:190
#5  0x004036b8 in main (argc=2, argv=0x7fffe018) at 
srcdir/stdcxx/branches/4.2.x/tests/localization/s.cpp:29

I hope you agree that this synchronization is sufficient for the facet 
initialization and reading of facet data.

Thanks.

Liviu


Re: STDCXX-1056 [was: Re: STDCXX forks]

2012-09-17 Thread Stefan Teleman
On Mon, Sep 17, 2012 at 11:17 AM, Liviu Nicoara nikko...@hates.ms wrote:

 I hope you agree that this synchronization is sufficient for the facet
 initialization and reading of facet data.

Sorry, I do not agree. Two different thread analyzers from two
different compilers written by two different compiler writers tell me
not to.

--Stefan

-- 
Stefan Teleman
KDE e.V.
stefan.tele...@gmail.com


Re: STDCXX-1056 [was: Re: STDCXX forks]

2012-09-17 Thread Liviu Nicoara

On 09/17/12 11:21, Stefan Teleman wrote:

On Mon, Sep 17, 2012 at 11:17 AM, Liviu Nicoara nikko...@hates.ms wrote:


I hope you agree that this synchronization is sufficient for the facet
initialization and reading of facet data.


Sorry, I do not agree. Two different thread analyzers from two
different compilers written by two different compiler writers tell me
not to.


Stefan, that is indeed your prerogative. However, please keep in mind that 
tools may be buggy or may have limitations beyond what is advertised. I do not 
ask you to have faith in my analysis, which would be absurd, but to look for 
yourself, exercise due diligence in testing the code and draw your own 
conclusions.

Thanks,
Liviu


Re: STDCXX-1056 [was: Re: STDCXX forks]

2012-09-17 Thread Wojciech Meyer
Liviu Nicoara nikko...@hates.ms writes:

 On 09/17/12 11:21, Stefan Teleman wrote:
 On Mon, Sep 17, 2012 at 11:17 AM, Liviu Nicoara nikko...@hates.ms wrote:

 I hope you agree that this synchronization is sufficient for the facet
 initialization and reading of facet data.

 Sorry, I do not agree. Two different thread analyzers from two
 different compilers written by two different compiler writers tell me
 not to.

 Stefan, that is indeed your prerogative. However, please keep in mind
 that tools may be buggy or may have limitations beyond what is
 advertised. I do not ask you to have faith in my analysis, which would
 be absurd, but to look for yourself, exercise due diligence in testing
 the code and draw your own conclusions.

so which compilers do fail? You know, some of them might use the same
component.

-- 
Wojciech



Re: STDCXX-1056 [was: Re: STDCXX forks]

2012-09-17 Thread Stefan Teleman
On Mon, Sep 17, 2012 at 11:38 AM, Wojciech Meyer wojciech.me...@arm.com wrote:

 so which compilers do fail? You know, some of them might use the same
 component.

Intel Compiler/Thread Analyzer on Linux, SunPro Compiler/Thread
Analyzer on Linux and Solaris (Intel and SPARC). All three of them
show the same exact problems.

The Intel Compilers and the SunPro Compilers have nothing in common
with each other.

-- 
Stefan Teleman
KDE e.V.
stefan.tele...@gmail.com


Sun fbe assembler manual

2012-09-17 Thread Liviu Nicoara

Hi all,

I need a reference manual for the fbe assembler. I am interested in the syntax 
of the `.type' directive. Do you know where such a manual would be located? The 
Solaris assembler manual I found on Oracle's website does not mention the .type 
directive.

Thanks!

Liviu