stdcxx-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From far...@apache.org
Subject svn commit: r702179 - in /stdcxx/branches/4.2.x/include/rw: _atomic-deccxx.h _atomic-mipspro.h _atomic-parisc.h _atomic-sparc.h _atomic-sync.h _atomic-x64.h _atomic-x86.h _atomic-xlc.h _atomic.h _mutex.h
Date Mon, 06 Oct 2008 15:33:23 GMT
Author: faridz
Date: Mon Oct  6 08:33:23 2008
New Revision: 702179

URL: http://svn.apache.org/viewvc?rev=702179&view=rev
Log:
2008-10-06  Farid Zaripov  <faridz@apache.org>

	* include/rw/_atomic-deccxx.h: #define corresponding
	_RWSTD_NO_XXX_ATOMIC_OPS macros for types, which are
	not supported in atomic operations.
	* include/rw/_atomic-mipspro.h: Ditto.
	* include/rw/_atomic-parisc.h: Ditto.
	* include/rw/_atomic-sparc.h: Ditto.
	* include/rw/_atomic-x86.h: Ditto.
	* include/rw/_atomic-xlc.h: Ditto.
	* include/rw/_atomic-x64.h: Ditto. Arrange 64-bit atomic
	functions into single #if/#endif block.
	* include/rw/_atomic-sync.h: Same.
	* include/rw/_atomic.h: Define generic bool, long and
	long long atomic functions only if the corresponding
	char/short/int/long atomic functions are defined.
	* include/rw/_mutex.h: Cleanup _RWSTD_NO_XXX_ATOMIC_OPS macros.
	(__rw_get_static_mutex): Check for presence of the int atomic
	operations instead of checking the PA RISC platform.

Modified:
    stdcxx/branches/4.2.x/include/rw/_atomic-deccxx.h
    stdcxx/branches/4.2.x/include/rw/_atomic-mipspro.h
    stdcxx/branches/4.2.x/include/rw/_atomic-parisc.h
    stdcxx/branches/4.2.x/include/rw/_atomic-sparc.h
    stdcxx/branches/4.2.x/include/rw/_atomic-sync.h
    stdcxx/branches/4.2.x/include/rw/_atomic-x64.h
    stdcxx/branches/4.2.x/include/rw/_atomic-x86.h
    stdcxx/branches/4.2.x/include/rw/_atomic-xlc.h
    stdcxx/branches/4.2.x/include/rw/_atomic.h
    stdcxx/branches/4.2.x/include/rw/_mutex.h

Modified: stdcxx/branches/4.2.x/include/rw/_atomic-deccxx.h
URL: http://svn.apache.org/viewvc/stdcxx/branches/4.2.x/include/rw/_atomic-deccxx.h?rev=702179&r1=702178&r2=702179&view=diff
==============================================================================
--- stdcxx/branches/4.2.x/include/rw/_atomic-deccxx.h (original)
+++ stdcxx/branches/4.2.x/include/rw/_atomic-deccxx.h Mon Oct  6 08:33:23 2008
@@ -33,6 +33,10 @@
 // get declarations of __ATOMIC_XXX intrinsics
 #  include <machine/builtins.h>
 
+#define _RWSTD_NO_CHAR_ATOMIC_OPS
+#define _RWSTD_NO_SHORT_ATOMIC_OPS
+#define _RWSTD_NO_LLONG_ATOMIC_OPS
+
 _RWSTD_NAMESPACE (__rw) {
 
 // __ATOMIC_[DE|IN]CREMENT_[LONG|QUAD] and __ATOMIC_EXCH_[LONG|QUAD] are

Modified: stdcxx/branches/4.2.x/include/rw/_atomic-mipspro.h
URL: http://svn.apache.org/viewvc/stdcxx/branches/4.2.x/include/rw/_atomic-mipspro.h?rev=702179&r1=702178&r2=702179&view=diff
==============================================================================
--- stdcxx/branches/4.2.x/include/rw/_atomic-mipspro.h (original)
+++ stdcxx/branches/4.2.x/include/rw/_atomic-mipspro.h Mon Oct  6 08:33:23 2008
@@ -32,6 +32,10 @@
 
 #  include <mutex.h>
 
+#define _RWSTD_NO_CHAR_ATOMIC_OPS
+#define _RWSTD_NO_SHORT_ATOMIC_OPS
+#define _RWSTD_NO_LLONG_ATOMIC_OPS
+
 _RWSTD_NAMESPACE (__rw) {
 
 inline unsigned
@@ -127,6 +131,8 @@
                                  false);
 }
 
+#  else   // _RWSTD_INT_SIZE == _RWSTD_LONG_SIZE
+#    define _RWSTD_NO_LONG_ATOMIC_OPS
 #  endif   // _RWSTD_INT_SIZE < _RWSTD_LONG_SIZE
 
 }   // namespace __rw

Modified: stdcxx/branches/4.2.x/include/rw/_atomic-parisc.h
URL: http://svn.apache.org/viewvc/stdcxx/branches/4.2.x/include/rw/_atomic-parisc.h?rev=702179&r1=702178&r2=702179&view=diff
==============================================================================
--- stdcxx/branches/4.2.x/include/rw/_atomic-parisc.h (original)
+++ stdcxx/branches/4.2.x/include/rw/_atomic-parisc.h Mon Oct  6 08:33:23 2008
@@ -30,6 +30,12 @@
  * 
  **************************************************************************/
 
+#define _RWSTD_NO_CHAR_ATOMIC_OPS
+#define _RWSTD_NO_SHORT_ATOMIC_OPS
+#define _RWSTD_NO_INT_ATOMIC_OPS
+#define _RWSTD_NO_LONG_ATOMIC_OPS
+#define _RWSTD_NO_LLONG_ATOMIC_OPS
+
 _RWSTD_NAMESPACE (__rw) {
     
 extern "C" {

Modified: stdcxx/branches/4.2.x/include/rw/_atomic-sparc.h
URL: http://svn.apache.org/viewvc/stdcxx/branches/4.2.x/include/rw/_atomic-sparc.h?rev=702179&r1=702178&r2=702179&view=diff
==============================================================================
--- stdcxx/branches/4.2.x/include/rw/_atomic-sparc.h (original)
+++ stdcxx/branches/4.2.x/include/rw/_atomic-sparc.h Mon Oct  6 08:33:23 2008
@@ -32,6 +32,10 @@
 
 _RWSTD_NAMESPACE (__rw) {
 
+#define _RWSTD_NO_CHAR_ATOMIC_OPS
+#define _RWSTD_NO_SHORT_ATOMIC_OPS
+#define _RWSTD_NO_LLONG_ATOMIC_OPS
+
 extern "C" {
 
 // define in assembler file "atomic-sparc.s" and "atomic-sparc64.s"
@@ -149,6 +153,8 @@
                                _RWSTD_STATIC_CAST (long, __y));
 }
 
+#  else   // _RWSTD_INT_SIZE == _RWSTD_LONG_SIZE
+#    define _RWSTD_NO_LONG_ATOMIC_OPS
 #  endif   // _RWSTD_INT_SIZE < _RWSTD_LONG_SIZE
 
 }   // namespace __rw

Modified: stdcxx/branches/4.2.x/include/rw/_atomic-sync.h
URL: http://svn.apache.org/viewvc/stdcxx/branches/4.2.x/include/rw/_atomic-sync.h?rev=702179&r1=702178&r2=702179&view=diff
==============================================================================
--- stdcxx/branches/4.2.x/include/rw/_atomic-sync.h (original)
+++ stdcxx/branches/4.2.x/include/rw/_atomic-sync.h Mon Oct  6 08:33:23 2008
@@ -92,49 +92,6 @@
 }
 
 
-#if defined (__ia64) || defined (__x86_64)
-#  if 4 < _RWSTD_LONG_SIZE
-
-inline long
-__rw_atomic_preincrement (long &__x, bool)
-{
-    _RWSTD_COMPILE_ASSERT (8 == sizeof (long));
-    return __sync_add_and_fetch (&__x, 1);
-}
-
-
-inline unsigned long
-__rw_atomic_preincrement (unsigned long &__x, bool)
-{
-    _RWSTD_COMPILE_ASSERT (8 == sizeof (unsigned long));
-    return __sync_add_and_fetch (&__x, 1);
-}
-
-#  endif   // _RWSTD_LONG_SIZE
-
-
-#  ifdef _RWSTD_LONG_LONG
-#    if _RWSTD_LLONG_SIZE > _RWSTD_LONG_SIZE
-
-inline _RWSTD_LONG_LONG
-__rw_atomic_preincrement (_RWSTD_LONG_LONG &__x, bool)
-{
-    _RWSTD_COMPILE_ASSERT (8 == sizeof (_RWSTD_LONG_LONG));
-    return __sync_add_and_fetch (&__x, 1);
-}
-
-
-inline unsigned _RWSTD_LONG_LONG
-__rw_atomic_preincrement (unsigned _RWSTD_LONG_LONG &__x, bool)
-{
-    _RWSTD_COMPILE_ASSERT (8 == sizeof (unsigned _RWSTD_LONG_LONG));
-    return __sync_add_and_fetch (&__x, 1);
-}
-
-#    endif   // _RWSTD_LLONG_SIZE > _RWSTD_LONG_SIZE
-#  endif   // _RWSTD_LONG_LONG
-#endif   // __ia64 || __x86_64
-
 inline char
 __rw_atomic_predecrement (char &__x, bool)
 {
@@ -191,50 +148,6 @@
 }
 
 
-#if defined (__ia64) || defined (__x86_64)
-#  if 4 < _RWSTD_LONG_SIZE
-
-inline long
-__rw_atomic_predecrement (long &__x, bool)
-{
-    _RWSTD_COMPILE_ASSERT (8 == sizeof (long));
-    return __sync_sub_and_fetch (&__x, 1);
-}
-
-
-inline unsigned long
-__rw_atomic_predecrement (unsigned long &__x, bool)
-{
-    _RWSTD_COMPILE_ASSERT (8 == sizeof (unsigned long));
-    return __sync_sub_and_fetch (&__x, 1);
-}
-
-#  endif   // _RWSTD_LONG_SIZE
-
-
-#  ifdef _RWSTD_LONG_LONG
-#    if _RWSTD_LLONG_SIZE > _RWSTD_LONG_SIZE
-
-inline _RWSTD_LONG_LONG
-__rw_atomic_predecrement (_RWSTD_LONG_LONG &__x, bool)
-{
-    _RWSTD_COMPILE_ASSERT (8 == sizeof (_RWSTD_LONG_LONG));
-    return __sync_sub_and_fetch (&__x, 1);
-}
-
-
-inline unsigned _RWSTD_LONG_LONG
-__rw_atomic_predecrement (unsigned _RWSTD_LONG_LONG &__x, bool)
-{
-    _RWSTD_COMPILE_ASSERT (8 == sizeof (unsigned _RWSTD_LONG_LONG));
-    return __sync_sub_and_fetch (&__x, 1);
-}
-
-#    endif   // _RWSTD_LLONG_SIZE > _RWSTD_LONG_SIZE
-#  endif   // _RWSTD_LONG_LONG
-#endif   // __ia64 || __x86_64
-
-
 inline char
 __rw_atomic_exchange (char &__x, char __y, bool)
 {
@@ -295,6 +208,38 @@
 #  if 4 < _RWSTD_LONG_SIZE
 
 inline long
+__rw_atomic_preincrement (long &__x, bool)
+{
+    _RWSTD_COMPILE_ASSERT (8 == sizeof (long));
+    return __sync_add_and_fetch (&__x, 1);
+}
+
+
+inline unsigned long
+__rw_atomic_preincrement (unsigned long &__x, bool)
+{
+    _RWSTD_COMPILE_ASSERT (8 == sizeof (unsigned long));
+    return __sync_add_and_fetch (&__x, 1);
+}
+
+
+inline long
+__rw_atomic_predecrement (long &__x, bool)
+{
+    _RWSTD_COMPILE_ASSERT (8 == sizeof (long));
+    return __sync_sub_and_fetch (&__x, 1);
+}
+
+
+inline unsigned long
+__rw_atomic_predecrement (unsigned long &__x, bool)
+{
+    _RWSTD_COMPILE_ASSERT (8 == sizeof (unsigned long));
+    return __sync_sub_and_fetch (&__x, 1);
+}
+
+
+inline long
 __rw_atomic_exchange (long &__x, long __y, bool)
 {
     _RWSTD_COMPILE_ASSERT (8 == sizeof (long));
@@ -309,11 +254,44 @@
     return __sync_lock_test_and_set (&__x, __y);
 }
 
-#  endif   // _RWSTD_LONG_SIZE == _RWSTD_INT_SIZE
+#  else
+#    define _RWSTD_NO_LONG_ATOMIC_OPS
+#  endif   // 4 < _RWSTD_LONG_SIZE
+
+
+#  if defined (_RWSTD_LONG_LONG) && (_RWSTD_LLONG_SIZE > _RWSTD_LONG_SIZE)
+
+inline _RWSTD_LONG_LONG
+__rw_atomic_preincrement (_RWSTD_LONG_LONG &__x, bool)
+{
+    _RWSTD_COMPILE_ASSERT (8 == sizeof (_RWSTD_LONG_LONG));
+    return __sync_add_and_fetch (&__x, 1);
+}
+
 
+inline unsigned _RWSTD_LONG_LONG
+__rw_atomic_preincrement (unsigned _RWSTD_LONG_LONG &__x, bool)
+{
+    _RWSTD_COMPILE_ASSERT (8 == sizeof (unsigned _RWSTD_LONG_LONG));
+    return __sync_add_and_fetch (&__x, 1);
+}
+
+
+inline _RWSTD_LONG_LONG
+__rw_atomic_predecrement (_RWSTD_LONG_LONG &__x, bool)
+{
+    _RWSTD_COMPILE_ASSERT (8 == sizeof (_RWSTD_LONG_LONG));
+    return __sync_sub_and_fetch (&__x, 1);
+}
+
+
+inline unsigned _RWSTD_LONG_LONG
+__rw_atomic_predecrement (unsigned _RWSTD_LONG_LONG &__x, bool)
+{
+    _RWSTD_COMPILE_ASSERT (8 == sizeof (unsigned _RWSTD_LONG_LONG));
+    return __sync_sub_and_fetch (&__x, 1);
+}
 
-#  ifdef _RWSTD_LONG_LONG
-#    if _RWSTD_LLONG_SIZE > _RWSTD_LONG_SIZE
 
 inline _RWSTD_LONG_LONG
 __rw_atomic_exchange (_RWSTD_LONG_LONG &__x, _RWSTD_LONG_LONG __y, bool)
@@ -331,8 +309,13 @@
     return __sync_lock_test_and_set (&__x, __y);
 }
 
-#    endif   // _RWSTD_LLONG_SIZE > _RWSTD_LONG_SIZE
-#  endif   // _RWSTD_LONG_LONG
+#  else
+#    define _RWSTD_NO_LLONG_ATOMIC_OPS
+#  endif   // _RWSTD_LONG_LONG && _RWSTD_LLONG_SIZE > _RWSTD_LONG_SIZE
+
+#else   // !__ia64 && !__x86_64
+#  define _RWSTD_NO_LONG_ATOMIC_OPS
+#  define _RWSTD_NO_LLONG_ATOMIC_OPS
 #endif   // __ia64 || __x86_64
 
 }   // namespace __rw

Modified: stdcxx/branches/4.2.x/include/rw/_atomic-x64.h
URL: http://svn.apache.org/viewvc/stdcxx/branches/4.2.x/include/rw/_atomic-x64.h?rev=702179&r1=702178&r2=702179&view=diff
==============================================================================
--- stdcxx/branches/4.2.x/include/rw/_atomic-x64.h (original)
+++ stdcxx/branches/4.2.x/include/rw/_atomic-x64.h Mon Oct  6 08:33:23 2008
@@ -183,64 +183,6 @@
 }
 
 
-#if 4 < _RWSTD_LONG_SIZE
-
-inline long
-__rw_atomic_preincrement (long &__x, bool)
-{
-    _RWSTD_COMPILE_ASSERT (8 == sizeof (long));
-
-    return __rw_atomic_add64 (_RWSTD_REINTERPRET_CAST (_RWSTD_INT64_T*, &__x),
-                              +1);
-}
-
-
-inline unsigned long
-__rw_atomic_preincrement (unsigned long &__x, bool)
-{
-    _RWSTD_COMPILE_ASSERT (8 == sizeof (unsigned long));
-
-    return __rw_atomic_add64 (_RWSTD_REINTERPRET_CAST (_RWSTD_INT64_T*, &__x),
-                              +1);
-}
-
-#endif   // _RWSTD_LONG_SIZE
-
-
-#ifdef _RWSTD_LONG_LONG
-#  if _RWSTD_LLONG_SIZE > _RWSTD_LONG_SIZE
-
-inline _RWSTD_LONG_LONG
-__rw_atomic_preincrement (_RWSTD_LONG_LONG &__x, bool)
-{
-    _RWSTD_COMPILE_ASSERT (8 == sizeof (_RWSTD_LONG_LONG));
-
-#ifdef _MSC_VER
-    return _InterlockedIncrement64 (_RWSTD_REINTERPRET_CAST (__int64*, &__x));
-#else
-    return __rw_atomic_add64 (_RWSTD_REINTERPRET_CAST (_RWSTD_INT64_T*, &__x),
-                              +1);
-#endif
-}
-
-
-inline unsigned _RWSTD_LONG_LONG
-__rw_atomic_preincrement (unsigned _RWSTD_LONG_LONG &__x, bool)
-{
-    _RWSTD_COMPILE_ASSERT (8 == sizeof (unsigned _RWSTD_LONG_LONG));
-
-#ifdef _MSC_VER
-    return _InterlockedIncrement64 (_RWSTD_REINTERPRET_CAST (__int64*, &__x));
-#else
-    return __rw_atomic_add64 (_RWSTD_REINTERPRET_CAST (_RWSTD_INT64_T*, &__x),
-                              +1);
-#endif
-}
-
-#  endif   // _RWSTD_LLONG_SIZE > _RWSTD_LONG_SIZE
-#endif   // _RWSTD_LONG_LONG
-
-
 inline char
 __rw_atomic_predecrement (char &__x, bool)
 {
@@ -327,64 +269,6 @@
 }
 
 
-#if 4 < _RWSTD_LONG_SIZE
-
-inline long
-__rw_atomic_predecrement (long &__x, bool)
-{
-    _RWSTD_COMPILE_ASSERT (8 == sizeof (long));
-
-    return __rw_atomic_add64 (_RWSTD_REINTERPRET_CAST (_RWSTD_INT64_T*, &__x),
-                              -1);
-}
-
-
-inline unsigned long
-__rw_atomic_predecrement (unsigned long &__x, bool)
-{
-    _RWSTD_COMPILE_ASSERT (8 == sizeof (unsigned long));
-
-    return __rw_atomic_add64 (_RWSTD_REINTERPRET_CAST (_RWSTD_INT64_T*, &__x),
-                              -1);
-}
-
-#endif   // _RWSTD_LONG_SIZE
-
-
-#ifdef _RWSTD_LONG_LONG
-#  if _RWSTD_LLONG_SIZE > _RWSTD_LONG_SIZE
-
-inline _RWSTD_LONG_LONG
-__rw_atomic_predecrement (_RWSTD_LONG_LONG &__x, bool)
-{
-    _RWSTD_COMPILE_ASSERT (8 == sizeof (_RWSTD_LONG_LONG));
-
-#ifdef _MSC_VER
-    return _InterlockedDecrement64 (_RWSTD_REINTERPRET_CAST (__int64*, &__x));
-#else
-    return __rw_atomic_add64 (_RWSTD_REINTERPRET_CAST (_RWSTD_INT64_T*, &__x),
-                              -1);
-#endif
-}
-
-
-inline unsigned _RWSTD_LONG_LONG
-__rw_atomic_predecrement (unsigned _RWSTD_LONG_LONG &__x, bool)
-{
-    _RWSTD_COMPILE_ASSERT (8 == sizeof (unsigned _RWSTD_LONG_LONG));
-
-#ifdef _MSC_VER
-    return _InterlockedDecrement64 (_RWSTD_REINTERPRET_CAST (__int64*, &__x));
-#else
-    return __rw_atomic_add64 (_RWSTD_REINTERPRET_CAST (_RWSTD_INT64_T*, &__x),
-                              -1);
-#endif
-}
-
-#  endif   // _RWSTD_LLONG_SIZE > _RWSTD_LONG_SIZE
-#endif   // _RWSTD_LONG_LONG
-
-
 inline char
 __rw_atomic_exchange (char &__x, char __y, bool)
 {
@@ -465,7 +349,47 @@
 }
 
 
-#  if 4 < _RWSTD_LONG_SIZE
+#if 4 < _RWSTD_LONG_SIZE
+
+inline long
+__rw_atomic_preincrement (long &__x, bool)
+{
+    _RWSTD_COMPILE_ASSERT (8 == sizeof (long));
+
+    return __rw_atomic_add64 (_RWSTD_REINTERPRET_CAST (_RWSTD_INT64_T*, &__x),
+                              +1);
+}
+
+
+inline unsigned long
+__rw_atomic_preincrement (unsigned long &__x, bool)
+{
+    _RWSTD_COMPILE_ASSERT (8 == sizeof (unsigned long));
+
+    return __rw_atomic_add64 (_RWSTD_REINTERPRET_CAST (_RWSTD_INT64_T*, &__x),
+                              +1);
+}
+
+
+inline long
+__rw_atomic_predecrement (long &__x, bool)
+{
+    _RWSTD_COMPILE_ASSERT (8 == sizeof (long));
+
+    return __rw_atomic_add64 (_RWSTD_REINTERPRET_CAST (_RWSTD_INT64_T*, &__x),
+                              -1);
+}
+
+
+inline unsigned long
+__rw_atomic_predecrement (unsigned long &__x, bool)
+{
+    _RWSTD_COMPILE_ASSERT (8 == sizeof (unsigned long));
+
+    return __rw_atomic_add64 (_RWSTD_REINTERPRET_CAST (_RWSTD_INT64_T*, &__x),
+                              -1);
+}
+
 
 inline long
 __rw_atomic_exchange (long &__x, long __y, bool)
@@ -486,11 +410,68 @@
                                _RWSTD_STATIC_CAST (_RWSTD_INT64_T, __y));
 }
 
-#  endif   // _RWSTD_LONG_SIZE == _RWSTD_INT_SIZE
+#else
+#  define _RWSTD_NO_LONG_ATOMIC_OPS
+#endif   // 4 < _RWSTD_LONG_SIZE
+
+
+#if defined (_RWSTD_LONG_LONG) && (_RWSTD_LLONG_SIZE > _RWSTD_LONG_SIZE)
+
+inline _RWSTD_LONG_LONG
+__rw_atomic_preincrement (_RWSTD_LONG_LONG &__x, bool)
+{
+    _RWSTD_COMPILE_ASSERT (8 == sizeof (_RWSTD_LONG_LONG));
+
+#ifdef _MSC_VER
+    return _InterlockedIncrement64 (_RWSTD_REINTERPRET_CAST (__int64*, &__x));
+#else
+    return __rw_atomic_add64 (_RWSTD_REINTERPRET_CAST (_RWSTD_INT64_T*, &__x),
+                              +1);
+#endif
+}
+
+
+inline unsigned _RWSTD_LONG_LONG
+__rw_atomic_preincrement (unsigned _RWSTD_LONG_LONG &__x, bool)
+{
+    _RWSTD_COMPILE_ASSERT (8 == sizeof (unsigned _RWSTD_LONG_LONG));
 
+#ifdef _MSC_VER
+    return _InterlockedIncrement64 (_RWSTD_REINTERPRET_CAST (__int64*, &__x));
+#else
+    return __rw_atomic_add64 (_RWSTD_REINTERPRET_CAST (_RWSTD_INT64_T*, &__x),
+                              +1);
+#endif
+}
+
+
+inline _RWSTD_LONG_LONG
+__rw_atomic_predecrement (_RWSTD_LONG_LONG &__x, bool)
+{
+    _RWSTD_COMPILE_ASSERT (8 == sizeof (_RWSTD_LONG_LONG));
+
+#ifdef _MSC_VER
+    return _InterlockedDecrement64 (_RWSTD_REINTERPRET_CAST (__int64*, &__x));
+#else
+    return __rw_atomic_add64 (_RWSTD_REINTERPRET_CAST (_RWSTD_INT64_T*, &__x),
+                              -1);
+#endif
+}
+
+
+inline unsigned _RWSTD_LONG_LONG
+__rw_atomic_predecrement (unsigned _RWSTD_LONG_LONG &__x, bool)
+{
+    _RWSTD_COMPILE_ASSERT (8 == sizeof (unsigned _RWSTD_LONG_LONG));
+
+#ifdef _MSC_VER
+    return _InterlockedDecrement64 (_RWSTD_REINTERPRET_CAST (__int64*, &__x));
+#else
+    return __rw_atomic_add64 (_RWSTD_REINTERPRET_CAST (_RWSTD_INT64_T*, &__x),
+                              -1);
+#endif
+}
 
-#ifdef _RWSTD_LONG_LONG
-#  if _RWSTD_LLONG_SIZE > _RWSTD_LONG_SIZE
 
 inline _RWSTD_LONG_LONG
 __rw_atomic_exchange (_RWSTD_LONG_LONG &__x, _RWSTD_LONG_LONG __y, bool)
@@ -522,7 +503,8 @@
 #endif
 }
 
-#  endif   // _RWSTD_LLONG_SIZE > _RWSTD_LONG_SIZE
-#endif   // _RWSTD_LONG_LONG
+#else
+#  define _RWSTD_NO_LLONG_ATOMIC_OPS
+#endif   // _RWSTD_LONG_LONG && _RWSTD_LLONG_SIZE > _RWSTD_LONG_SIZE
 
 }   // namespace __rw

Modified: stdcxx/branches/4.2.x/include/rw/_atomic-x86.h
URL: http://svn.apache.org/viewvc/stdcxx/branches/4.2.x/include/rw/_atomic-x86.h?rev=702179&r1=702178&r2=702179&view=diff
==============================================================================
--- stdcxx/branches/4.2.x/include/rw/_atomic-x86.h (original)
+++ stdcxx/branches/4.2.x/include/rw/_atomic-x86.h Mon Oct  6 08:33:23 2008
@@ -30,6 +30,9 @@
  * 
  **************************************************************************/
 
+#define _RWSTD_NO_LONG_ATOMIC_OPS
+#define _RWSTD_NO_LLONG_ATOMIC_OPS
+
 #ifdef _MSC_VER
 
 extern "C" long __cdecl _InterlockedIncrement (volatile long*);

Modified: stdcxx/branches/4.2.x/include/rw/_atomic-xlc.h
URL: http://svn.apache.org/viewvc/stdcxx/branches/4.2.x/include/rw/_atomic-xlc.h?rev=702179&r1=702178&r2=702179&view=diff
==============================================================================
--- stdcxx/branches/4.2.x/include/rw/_atomic-xlc.h (original)
+++ stdcxx/branches/4.2.x/include/rw/_atomic-xlc.h Mon Oct  6 08:33:23 2008
@@ -32,6 +32,10 @@
 
 #include <sys/atomic_op.h>
 
+#define _RWSTD_NO_CHAR_ATOMIC_OPS
+#define _RWSTD_NO_SHORT_ATOMIC_OPS
+#define _RWSTD_NO_LLONG_ATOMIC_OPS
+
 _RWSTD_NAMESPACE (__rw) {
 
 inline int
@@ -137,6 +141,8 @@
                                  _RWSTD_STATIC_CAST (long, __y), false);
 }
 
+#  else   // _RWSTD_INT_SIZE == _RWSTD_LONG_SIZE
+#    define _RWSTD_NO_LONG_ATOMIC_OPS
 #  endif   // _RWSTD_INT_SIZE < _RWSTD_LONG_SIZE
 
 }   // namespace __rw

Modified: stdcxx/branches/4.2.x/include/rw/_atomic.h
URL: http://svn.apache.org/viewvc/stdcxx/branches/4.2.x/include/rw/_atomic.h?rev=702179&r1=702178&r2=702179&view=diff
==============================================================================
--- stdcxx/branches/4.2.x/include/rw/_atomic.h (original)
+++ stdcxx/branches/4.2.x/include/rw/_atomic.h Mon Oct  6 08:33:23 2008
@@ -76,11 +76,14 @@
 
 #    ifndef _RWSTD_NO_BOOL
 
-#      if _RWSTD_BOOL_SIZE == _RWSTD_CHAR_SIZE
+#      if   _RWSTD_BOOL_SIZE == _RWSTD_CHAR_SIZE  \
+         && !defined (_RWSTD_NO_CHAR_ATOMIC_OPS)
 #        define _RWSTD_BOOL_TYPE char
-#      elif _RWSTD_BOOL_SIZE == _RWSTD_SHORT_SIZE
+#      elif _RWSTD_BOOL_SIZE == _RWSTD_SHORT_SIZE \
+         && !defined (_RWSTD_NO_SHORT_ATOMIC_OPS)
 #        define _RWSTD_BOOL_TYPE short
-#      elif _RWSTD_BOOL_SIZE == _RWSTD_INT_SIZE
+#      elif _RWSTD_BOOL_SIZE == _RWSTD_INT_SIZE   \
+         && !defined (_RWSTD_NO_INT_ATOMIC_OPS)
 #        define _RWSTD_BOOL_TYPE int
 #      endif
 
@@ -107,7 +110,11 @@
 
 /********************** generic long functions ************************/
 
-#    if _RWSTD_LONG_SIZE == _RWSTD_INT_SIZE
+#    if   _RWSTD_LONG_SIZE == _RWSTD_INT_SIZE \
+       && defined (_RWSTD_NO_LONG_ATOMIC_OPS) \
+       && !defined (_RWSTD_NO_INT_ATOMIC_OPS)
+
+#      undef _RWSTD_NO_LONG_ATOMIC_OPS
 
 #      if 6 == _RWSTD_HP_aCC_MAJOR
          // suppress HP aCC 64 bit migration remark: conversion from
@@ -174,8 +181,12 @@
 
 /********************** generic long long functions *******************/
 
-#    ifdef _RWSTD_LONG_LONG
-#      if _RWSTD_LLONG_SIZE == _RWSTD_LONG_SIZE
+#    if   defined (_RWSTD_LONG_LONG)            \
+       && _RWSTD_LLONG_SIZE == _RWSTD_LONG_SIZE \
+       && defined (_RWSTD_NO_LLONG_ATOMIC_OPS)  \
+       && !defined (_RWSTD_NO_LONG_ATOMIC_OPS)
+
+#      undef _RWSTD_NO_LLONG_ATOMIC_OPS
 
 _RWSTD_NAMESPACE (__rw) {
     
@@ -226,8 +237,7 @@
 
 }   // namespace __rw
 
-#      endif   // _RWSTD_LLONG_SIZE == _RWSTD_LONG_SIZE
-#    endif   // _RWSTD_LONG_LONG
+#    endif   // _RWSTD_LONG_LONG && _RWSTD_LLONG_SIZE == _RWSTD_LONG_SIZE
 
 #  endif   // _RWSTD_NO_ATOMIC_OPS
 

Modified: stdcxx/branches/4.2.x/include/rw/_mutex.h
URL: http://svn.apache.org/viewvc/stdcxx/branches/4.2.x/include/rw/_mutex.h?rev=702179&r1=702178&r2=702179&view=diff
==============================================================================
--- stdcxx/branches/4.2.x/include/rw/_mutex.h (original)
+++ stdcxx/branches/4.2.x/include/rw/_mutex.h Mon Oct  6 08:33:23 2008
@@ -295,16 +295,16 @@
     // up with multiple copies)
     static volatile int __cntr /* = 0 */;   // initialization counter
 
-#    if !defined (_RWSTD_NO_ATOMIC_OPS) && !defined (_PA_RISC2_0)
+#    if !defined (_RWSTD_NO_ATOMIC_OPS) && !defined (_RWSTD_NO_INT_ATOMIC_OPS)
     // MT safe
     // cast __cntr to int& (see STDCXX-792)
     // casting should be removed after fixing STDCXX-794
     if (0 == __cntr && 1 == _RWSTD_ATOMIC_PREINCREMENT (
             _RWSTD_CONST_CAST (int&, __cntr), false))
-#    else
+#    else   // _RWSTD_NO_ATOMIC_OPS || _RWSTD_NO_INT_ATOMIC_OPS
     // not so safe (volatile should help)
     if (0 == __cntr && 1 == ++__cntr)
-#    endif   // _RWSTD_NO_ATOMIC_OPS
+#    endif   // !_RWSTD_NO_ATOMIC_OPS && !_RWSTD_NO_INT_ATOMIC_OPS
 
     {
         // manually initialize `mutex' via a call to placement new
@@ -445,4 +445,25 @@
 
 #endif   // _RWSTD_REENTRANT
 
+// clean up
+#ifdef _RWSTD_NO_CHAR_ATOMIC_OPS
+#  undef _RWSTD_NO_CHAR_ATOMIC_OPS
+#endif
+
+#ifdef _RWSTD_NO_SHORT_ATOMIC_OPS
+#  undef _RWSTD_NO_SHORT_ATOMIC_OPS
+#endif
+
+#ifdef _RWSTD_NO_INT_ATOMIC_OPS
+#  undef _RWSTD_NO_INT_ATOMIC_OPS
+#endif
+
+#ifdef _RWSTD_NO_LONG_ATOMIC_OPS
+#  undef _RWSTD_NO_LONG_ATOMIC_OPS
+#endif
+
+#ifdef _RWSTD_NO_LLONG_ATOMIC_OPS
+#  undef _RWSTD_NO_LLONG_ATOMIC_OPS
+#endif
+
 #endif   // _RWSTD_RW_MUTEX_H_INCLUDED



Mime
View raw message