The patch looks reasonable to me, except for the missing guard
for _RWSTD_NO_LONG_DOUBLE. For C++ 11 compilers, we might want
to replace the union with the alignas features. Of course, that
will require another configuration test and macro, and most
likely won't help the current Sun Studio compiler (unless it
already implements alignas). Although it's possible that the
compiler supports the GCC aligned attribute (we might want to
use it with Linux compilers versions that don't yet implement
C++ 11 alignas).

Martin

On 09/28/2012 06:29 AM, Liviu Nicoara wrote:
I have created the above and linked it to the closed STDCXX-1066.

In short, my reading about this issue is that the kernel patch changed
the alignment of the userland mutex objects from a machine word to a
double-word boundary. No changes are required of the users who use such
objects in their programs unless users create mutex objects in buffers
which may not be aligned on a proper boundary. E.g., the following are
safe:

mutex_t lock;

struct S {
char misalign;
mutex_t lock;
};

whereas the following is not:

union {
void* align;
char buf [sizeof mutex_t];
} u;

new (&u) mutex_t;

because the alignment requirements for void pointer are less strict than
for mutex_t. A few places in the library use the latter for all sorts of
static objects (mostly local statics). I looked esp. for places where we
build objects that contain mutex sub-objects inside a union-aligned buffer:

struct S {
char c;
mutex_t m;
};

...

union {
void* align; // <- incorrect
char buf [sizeof (S)];
} u;

new (&u) S ();

The alignment must be changed to a value equal or greater than the mutex
alignment requirements.

IMO, the patch I attached does not break binary compatibility. It uses a
one size fits all long double for alignment -- like we use in
rw/_mutex.h -- but in doing so dispenses with all sorts of preprocessor
conditionals.

I still don't have access to a SPARC machine. Any feed-back and/or SPARC
build results are more than welcome!

Thanks!

Liviu


Reply via email to