Issue Details (XML | Word | Printable)

Key: STDCXX-1040
Type: Improvement Improvement
Status: In Progress In Progress
Priority: Critical Critical
Assignee: Martin Sebor
Reporter: Martin Sebor
Votes: 0
Watchers: 0
Operations

If you were logged in you would be able to see more operations.
C++ Standard Library

Solaris 10 Kernel Update 137111-01 patches

Created: 14/Aug/09 08:40 PM   Updated: 12/Sep/09 10:42 PM
Return to search
Component/s: Build and Installation
Affects Version/s: 4.2.0, 4.2.1
Fix Version/s: 4.2.2

Time Tracking:
Not Specified

File Attachments:
  Size
File Licensed for inclusion in ASF works stdcxx-upstream-patches.tar.bz2 2009-08-14 08:42 PM Martin Sebor 6 kB
Environment: Solaris 10 10/2008 SPARC, Kernel Update 137111-01

Patch Info: Patch Available
Severity: Binary Incompatibility


 Description  « Hide
Quoting from this post :

Solaris 10 10/2008 SPARC has introduced a binary incompatible change
in the POSIX and Solaris threads implementation:

http://docs.sun.com/app/docs/doc/820-5245/chapter2-1000?a=view

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"

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:

http://bugs.opensolaris.org/view_bug.do?bug_id=6729759

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:

http://s247136804.onlinehome.us/stdcxx-upstream/4.2.1/

You can download the tarball with all the patches from the same URL:

http://s247136804.onlinehome.us/stdcxx-upstream/4.2.1/stdcxx-upstream-patches.tar.bz2

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 ].



 All   Comments   Work Log   Change History   Subversion Commits      Sort Order: Ascending order - Click to sort in descending order
No work has yet been logged on this issue.