incubator-stdcxx-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Martin Sebor <>
Subject Soalris 10 10/2008 SPARC changes (was: Re: 4.2.2 release)
Date Fri, 14 Aug 2009 20:24:40 GMT
Thanks for the heads up and the patches! I'll review apply them
if possible/necessary before the release.

I took a quick glance at a few of the diff files and I wonder if
you could help me better understand some of the changes in case
they could be applied unconditionally.

For instance, in ctype.cpp.38.diff, it seems as though the second
hunk would be a good change to make regardless (when long long is
available). Ditto for the third hunk in locale_body.37.diff (minus
the pragmas, of course), and similarly in locale_classic.40.diff
and messages.cpp.41.diff.

The approach I'm thinking of using is the one you applied in
use_facet.h, i.e., defining, say, _RWSTD_ALIGN_MAX_T to unsigned
long long, and using it in all the aligned buffers, along with
unsigned char for the data.

Other than these, can you also help me understand the changes in
messages.cpp.41.diff (starting with the third hunk on line 92)?

Thanks again,

Stefan Teleman wrote:
> On Fri, Aug 14, 2009 at 15:18, Martin Sebor<> wrote:
>> I think we should think about cutting a 4.2.2 release sometime this
>> month. It's been embarrassingly long since 4.2.1. Farid (or anyone
>> else), do you have anything that you'd like included in it?
>> Martin
> Hi.
> Solaris 10 10/2008 SPARC has introduced a binary incompatible change
> in the POSIX and Solaris threads implementation:
> Objects of type mutex_t and pthread_mutex_t must start at 8-byte
> aligned addresses. Applications that do not satisfy this requirement
> fail. The following error message is displayed:
> *** _THREAD_ERROR_DETECTION: lock usage error detected ***
> ...
> "mutex is misaligned"
> OR:
> "condvar is misaligned"
> </QUOTE>
> In reality, the run-time performance is much worse than the errata
> above claims: misaligned mutexes or conditional variables cause the
> program to spuriously SEGV in sometimes hard to reproduce ways [
> Heisenbug ].
> You can view full details of this bug/change here:
> To make a long story short, Solaris Kernel Update 137111-01 introduced
> an ABI incompatible implementation restriction, requiring that mutexes
> and conditional variables must be 8-byte aligned. This restriction has
> never been documented, nor has it ever been enforced, until Solaris 10
> 10/2008 [ Solaris Kernel Update 137111-01 ].
> The consequence of this KU is that, the multi-threaded 32-bit SPARC
> version of the Apache Standard C++ Library [ 4.2.1 ] will no longer
> work, and will fail at run-time with seemingly unexplainable crashes [
> the exact same build will work on Solaris versions prior to Kernel
> Update 137111-01 ].
> This problem is not specific to the Apache Standard C++ Library: it
> will occur with any 32-bit SPARCV8 binaries which do not align mutexes
> or conditional variables on an 8 byte boundary.
> I have created a set of patches for the Apache Standard C++ Library,
> Version 4.2.1, for this problem:
> You can download the tarball with all the patches from the same URL:
> These patches force an 8-byte alignment for all objects which contain
> a mutex or a conditional variable, and that only for SPARC. With these
> patches, all the tests perform as expected.
> The patch 22.locale.numpunct.cpp.43.diff is not related to the SPARCV8
> ABI change -- it is simply an avoidance of a SEGV in case the variable
> first_non_c == NULL [ Solaris sprintf(3C) SEGV's on NULL char*
> arguments ].
> --Stefan

View raw message