On 9/28/12 11:32 AM, Travis Vitek wrote:
-----Original Message-----
From: Liviu Nicoara
Sent: Friday, September 28, 2012 5:29 AM
[...]
The patch assumes the type `long double' exists on every platform. While I do
believe that it is available everywhere, we have lots of conditional code
guarding its use in the library now. If we are going to use `long double' in
this context, we should guard it with _RWSTD_NO_LONG_DOUBLE. I think an even
cleaner solution is to switch to using __rw_aligned_buffer instead. It gives us
a single point of failure for alignment issues like this, and it makes the code
self-documenting and easier to read.
I am attaching another patch here, which makes use of the __rw_aligned_buffer,
slightly more verbose but the code is slightly cleaner.
Thanks!
Liviu
Index: src/messages.cpp
===================================================================
--- src/messages.cpp (revision 1390953)
+++ src/messages.cpp (working copy)
@@ -38,6 +38,7 @@
#include <rw/_mutex.h>
+#include "podarray.h"
#if !defined (_RWSTD_NO_NL_TYPES_H) && !defined (_RWSTD_NO_CATOPEN_CATGETS)
# include <nl_types.h>
@@ -64,10 +65,7 @@ _RWSTD_NAMESPACE (__rw) {
struct __rw_open_cat_data
{
nl_catd catd;
- union {
- void *_C_align;
- char _C_data [sizeof (_STD::locale)];
- } loc;
+ __rw_aligned_buffer<_STD::locale> loc;
};
struct __rw_open_cat_page
@@ -159,7 +157,8 @@ __rw_manage_cat_data (int &cat, __rw_op
cat = int (n_catalogs);
catalogs [cat]->catd = pcat_data->catd;
- memcpy (&catalogs [cat]->loc, &pcat_data->loc,
+ memcpy (catalogs [cat]->loc._C_store (),
+ pcat_data->loc._C_store (),
sizeof (_STD::locale));
if (size_t (cat) > largest_cat)
@@ -175,7 +174,8 @@ __rw_manage_cat_data (int &cat, __rw_op
}
catalogs [cat]->catd = pcat_data->catd;
- memcpy (&catalogs [cat]->loc, &pcat_data->loc,
+ memcpy (catalogs [cat]->loc._C_store (),
+ pcat_data->loc._C_store (),
sizeof (_STD::locale));
if (size_t (cat) > largest_cat)
@@ -258,8 +258,9 @@ int __rw_cat_open (const _STD::string &c
return -1;
__rw_open_cat_data cat_data;
+
cat_data.catd = catd;
- new (&cat_data.loc) _STD::locale (loc);
+ new (cat_data.loc._C_store ()) _STD::locale (loc);
int cat = -1;
__rw_manage_cat_data (cat, &cat_data);
@@ -307,7 +308,7 @@ const _STD::locale& __rw_get_locale (int
_RWSTD_ASSERT (0 != pcat_data);
- return *(_RWSTD_REINTERPRET_CAST (_STD::locale*, &(pcat_data->loc)));
+ return *pcat_data->loc._C_data ();
}
@@ -329,8 +330,7 @@ void __rw_cat_close (int cat)
catclose (pcat_data->catd);
- _STD::locale* const ploc =
- _RWSTD_REINTERPRET_CAST (_STD::locale*, &pcat_data->loc);
+ _STD::locale* const ploc = pcat_data->loc._C_data ();
ploc->~locale ();
Index: src/locale_body.cpp
===================================================================
--- src/locale_body.cpp (revision 1390953)
+++ src/locale_body.cpp (working copy)
@@ -1024,14 +1024,12 @@ _C_manage (__rw_locale *plocale, const c
// the classic C locale is statically allocated
// and not destroyed during the lifetime of the process
- static union {
- void* _C_align;
- char _C_buf [sizeof (__rw_locale)];
- } classic_body;
+ static __rw_aligned_buffer<__rw_locale> classic_body;
// construct a locale body in place
// with the initial reference count of 1
- classic = new (&classic_body) __rw_locale (locname);
+ classic = new (classic_body._C_store ())
+ __rw_locale (locname);
_RWSTD_ASSERT (1 == classic->_C_ref);
}
Index: src/use_facet.h
===================================================================
--- src/use_facet.h (revision 1390953)
+++ src/use_facet.h (working copy)
@@ -37,6 +37,7 @@
#include <rw/_defs.h>
#include "access.h"
+#include "podarray.h"
// helper macro _RWSTD_DEFINE_FACET_FACTORY() defines a facet factory
@@ -63,12 +64,9 @@
} \
else { \
/* construct an ordinary facet in static memory */ \
- static union { \
- void *align_; \
- char data_ [sizeof (__rw_ ## fid ## _facet)]; \
- } f; \
+ static __rw_aligned_buffer<__rw_ ## fid ## _facet> f; \
static __rw_facet* const pf = \
- new (&f) __rw_ ## fid ## _facet (ref); \
+ new (f._C_store ()) __rw_ ## fid ## _facet (ref); \
pfacet = pf; \
} \
/* set the pointer to the facet id */ \
@@ -90,12 +88,9 @@
__rw_ct_ ## fid (_RWSTD_SIZE_T ref, const char*) \
{ \
/* construct an ordinary facet in static memory */ \
- static union { \
- void *align_; \
- char data_ [sizeof (__rw_ ## fid ## _facet)]; \
- } f; \
+ static __rw_aligned_buffer<__rw_ ## fid ## _facet> f; \
static __rw_facet* const pf = \
- new (&f) __rw_ ## fid ## _facet (ref); \
+ new (f._C_store ()) __rw_ ## fid ## _facet (ref); \
/* set the pointer to the facet id */ \
__rw_access::_C_get_pid (*pf) = \
&(__rw_access::_C_get_id (__rw_ ## fid ## _facet::id)); \
Index: src/ctype.cpp
===================================================================
--- src/ctype.cpp (revision 1390953)
+++ src/ctype.cpp (working copy)
@@ -626,12 +626,9 @@ _RWSTD_EXPORT __rw_facet* __rw_ct_ctype
pfacet = new _STD::ctype_byname<char>(name, ref);
}
else {
- static union {
- void *align_;
- char data_ [sizeof (_STD::ctype<char>)];
- } f;
- static __rw_facet* const pf =
- new (&f) _STD::ctype<char>(__rw_classic_tab, false, ref);
+ static __rw_aligned_buffer<_STD::ctype<char> > f;
+ static __rw_facet* const pf = new (f._C_store ())
+ _STD::ctype<char> (__rw_classic_tab, false, ref);
pfacet = pf;
}
Index: src/locale_classic.cpp
===================================================================
--- src/locale_classic.cpp (revision 1390953)
+++ src/locale_classic.cpp (working copy)
@@ -33,16 +33,13 @@
#include <loc/_locale.h> // for locale
#include "once.h" // for __rw_once()
+#include "podarray.h"
_RWSTD_NAMESPACE (__rw) {
// static buffer for the classic "C" locale object
-static union {
- void* _C_align;
- char _C_buf [sizeof (_STD::locale)];
-} __rw_classic;
-
+static __rw_aligned_buffer<_STD::locale> __rw_classic;
// init-once flag for the classic "C" locale object
static __rw_once_t
@@ -67,7 +64,7 @@ __rw_init_classic ()
#endif // _RWSTDDEBUG
// construct the classic "C" locale in the provided buffer
- new (&__rw_classic) _STD::locale ("C");
+ new (__rw_classic._C_store ()) _STD::locale ("C");
}
} // extern "C"
@@ -78,15 +75,14 @@ __rw_init_classic ()
_RWSTD_NAMESPACE (std) {
-/* static */ const locale& locale::
-classic ()
+/* static */ const locale&
+locale::classic ()
{
// initialize classic locale in the static buffer exactly once
_RW::__rw_once (&_RW::__rw_classic_once_init, _RW::__rw_init_classic);
// cast the address of the buffer to a locale pointer
- const locale* const pclassic =
- _RWSTD_REINTERPRET_CAST (locale*, &_RW::__rw_classic);
+ const locale* const pclassic = _RW::__rw_classic._C_data ();
_RWSTD_ASSERT (0 != pclassic->_C_body);