compare_and_swap reorganization. This should finally make it compile on MacOS X.
authorStefan Ring <stefan@complang.tuwien.ac.at>
Sat, 14 Feb 2009 13:43:32 +0000 (14:43 +0100)
committerStefan Ring <stefan@complang.tuwien.ac.at>
Sat, 14 Feb 2009 13:43:32 +0000 (14:43 +0100)
* src/threads/atomic.hpp: Reorganized namespace declarations.
(CAS_32_functor, CAS_64_functor, CAS_chooser, CAS): Helper templates for letting
the compiler figure out which version of compare_and_swap to use.

* src/threads/atomic.cpp: generic_compare_and_swap now lives in namespace Atomic.
* src/native/vm/sun_misc_Unsafe.cpp: Adapted usage of compare_and_swap.

* src/vm/jit/alpha/md-atomic.hpp: Adapted to new namespace.
* src/vm/jit/arm/md-atomic.hpp: Likewise.
* src/vm/jit/i386/md-atomic.hpp: Likewise.
* src/vm/jit/m68k/md-atomic.hpp: Likewise.
* src/vm/jit/mips/md-atomic.hpp: Likewise.
* src/vm/jit/powerpc/md-atomic.hpp: Likewise.
* src/vm/jit/powerpc64/md-atomic.hpp: Likewise.
* src/vm/jit/s390/md-atomic.hpp: Likewise.
* src/vm/jit/sparc64/md-atomic.hpp: Likewise.
* src/vm/jit/x86_64/md-atomic.hpp: Likewise.

13 files changed:
src/native/vm/sun_misc_Unsafe.cpp
src/threads/atomic.cpp
src/threads/atomic.hpp
src/vm/jit/alpha/md-atomic.hpp
src/vm/jit/arm/md-atomic.hpp
src/vm/jit/i386/md-atomic.hpp
src/vm/jit/m68k/md-atomic.hpp
src/vm/jit/mips/md-atomic.hpp
src/vm/jit/powerpc/md-atomic.hpp
src/vm/jit/powerpc64/md-atomic.hpp
src/vm/jit/s390/md-atomic.hpp
src/vm/jit/sparc64/md-atomic.hpp
src/vm/jit/x86_64/md-atomic.hpp

index a6c86a6daa8550c3e799ef774a7556a7123c4a73..63ec0c201708bb0a05f8e4476438cedf444b0a81 100644 (file)
@@ -899,14 +899,14 @@ JNIEXPORT void JNICALL Java_sun_misc_Unsafe_throwException(JNIEnv *env, jobject
  */
 JNIEXPORT jboolean JNICALL Java_sun_misc_Unsafe_compareAndSwapObject(JNIEnv *env, jobject _this, jobject o, jlong offset, jobject expected, jobject x)
 {
-       volatile void **p;
+       void **p;
        void           *result;
 
        /* XXX Use LLNI */
 
-       p = (volatile void **) (((uint8_t *) o) + offset);
+       p = (void **) (((uint8_t *) o) + offset);
 
-       result = Atomic::compare_and_swap(p, expected, x);
+       result = Atomic::compare_and_swap(p, (void *) expected, (void *) x);
 
        if (result == expected)
                return true;
@@ -929,7 +929,7 @@ JNIEXPORT jboolean JNICALL Java_sun_misc_Unsafe_compareAndSwapInt(JNIEnv *env, j
 
        p = (uint32_t *) (((uint8_t *) o) + offset);
 
-       result = Atomic::compare_and_swap(p, expected, x);
+       result = Atomic::compare_and_swap(p, (uint32_t) expected, (uint32_t) x);
 
        if (result == (uint32_t) expected)
                return true;
@@ -952,7 +952,7 @@ JNIEXPORT jboolean JNICALL Java_sun_misc_Unsafe_compareAndSwapLong(JNIEnv *env,
 
        p = (uint64_t *) (((uint8_t *) o) + offset);
 
-       result = Atomic::compare_and_swap(p, expected, x);
+       result = Atomic::compare_and_swap(p, (uint64_t) expected, (uint64_t) x);
 
        if (result == (uint64_t) expected)
                return true;
index bfe72af8040073b016d06ae14708b4041d428283..b87b28cc5dabff3a67ef51fb3cbb4385c37fbc40 100644 (file)
@@ -33,6 +33,7 @@
 // Gobal mutex for generic atomic instructions.
 static Mutex lock;
 
+namespace Atomic {
 
 /**
  * A generic atomic compare and swap for 32-bit integer values.  This
@@ -44,7 +45,7 @@ static Mutex lock;
  *
  * @return value of the memory location before the store
  */
-uint32_t Atomic::generic_compare_and_swap(volatile uint32_t *p, uint32_t oldval, uint32_t newval)
+uint32_t generic_compare_and_swap(volatile uint32_t *p, uint32_t oldval, uint32_t newval)
 {
        uint32_t result;
 
@@ -73,7 +74,7 @@ uint32_t Atomic::generic_compare_and_swap(volatile uint32_t *p, uint32_t oldval,
  *
  * @return value of the memory location before the store
  */
-uint64_t Atomic::generic_compare_and_swap(volatile uint64_t *p, uint64_t oldval, uint64_t newval)
+uint64_t generic_compare_and_swap(volatile uint64_t *p, uint64_t oldval, uint64_t newval)
 {
        uint64_t result;
 
@@ -102,7 +103,7 @@ uint64_t Atomic::generic_compare_and_swap(volatile uint64_t *p, uint64_t oldval,
  *
  * @return value of the memory location before the store
  */
-void* Atomic::generic_compare_and_swap(volatile void** p, void* oldval, void* newval)
+void* generic_compare_and_swap(volatile void** p, void* oldval, void* newval)
 {
        void* result;
 
@@ -125,19 +126,20 @@ void* Atomic::generic_compare_and_swap(volatile void** p, void* oldval, void* ne
  * A generic memory barrier.  This function is using a mutex to
  * provide atomicity.
  */
-void Atomic::generic_memory_barrier(void)
+void generic_memory_barrier(void)
 {
        lock.lock();
        lock.unlock();
 }
 
+}
 
 // Legacy C interface.
 
 extern "C" {
-uint32_t Atomic_compare_and_swap_32(volatile uint32_t *p, uint32_t oldval, uint32_t newval) { return Atomic::compare_and_swap(p, oldval, newval); }
-uint64_t Atomic_compare_and_swap_64(volatile uint64_t *p, uint64_t oldval, uint64_t newval) { return Atomic::compare_and_swap(p, oldval, newval); }
-void*    Atomic_compare_and_swap_ptr(volatile void** p, void* oldval, void* newval) { return Atomic::compare_and_swap(p, oldval, newval); }
+uint32_t Atomic_compare_and_swap_32(uint32_t *p, uint32_t oldval, uint32_t newval) { return Atomic::compare_and_swap(p, oldval, newval); }
+uint64_t Atomic_compare_and_swap_64(uint64_t *p, uint64_t oldval, uint64_t newval) { return Atomic::compare_and_swap(p, oldval, newval); }
+void*    Atomic_compare_and_swap_ptr(void** p, void* oldval, void* newval) { return Atomic::compare_and_swap(p, oldval, newval); }
 void     Atomic_memory_barrier(void) { Atomic::memory_barrier(); }
 void     Atomic_write_memory_barrier(void) { Atomic::write_memory_barrier(); }
 void     Atomic_instruction_barrier(void) { Atomic::instruction_barrier(); }
index 382a8724bc2b5e3b7c1c9f60f02d7c32bef3a4ad..a3875d632921b9df564603fd7568c680155a75b3 100644 (file)
 
 #ifdef __cplusplus
 
-class Atomic {
-public:
+namespace Atomic_md {
+       // Machine dependent functions.
+       uint32_t compare_and_swap(volatile uint32_t *p, uint32_t oldval, uint32_t newval);
+       uint64_t compare_and_swap(volatile uint64_t *p, uint64_t oldval, uint64_t newval);
+
+       void     memory_barrier(void);
+       void     write_memory_barrier(void);
+       void     instruction_barrier(void);
+}
+
+namespace Atomic {
+
        // Generic functions.
-       static uint32_t generic_compare_and_swap(volatile uint32_t *p, uint32_t oldval, uint32_t newval);
-       static uint64_t generic_compare_and_swap(volatile uint64_t *p, uint64_t oldval, uint64_t newval);
-       static void*    generic_compare_and_swap(volatile void** p, void* oldval, void* newval);
-       static void     generic_memory_barrier(void);
+       uint32_t generic_compare_and_swap(volatile uint32_t *p, uint32_t oldval, uint32_t newval);
+       uint64_t generic_compare_and_swap(volatile uint64_t *p, uint64_t oldval, uint64_t newval);
+       void*    generic_compare_and_swap(volatile void** p, void* oldval, void* newval);
+       void     generic_memory_barrier(void);
 
-       // Machine dependent functions.
-       static uint32_t compare_and_swap(volatile uint32_t *p, uint32_t oldval, uint32_t newval);
-       static uint64_t compare_and_swap(volatile uint64_t *p, uint64_t oldval, uint64_t newval);
-       static void*    compare_and_swap(volatile void** p, void* oldval, void* newval);
-       static void     memory_barrier(void);
-       static void     write_memory_barrier(void);
-       static void     instruction_barrier(void);
-};
+}
 
 // Include machine dependent implementation.
 #include "md-atomic.hpp"
 
+namespace Atomic {
+
+       struct CAS_32_functor {
+               typedef uint32_t value_type;
+               static value_type compare_and_swap(value_type *p, value_type o, value_type n) {
+                       return Atomic_md::compare_and_swap(p, o, n);
+               }
+       };
+
+       struct CAS_64_functor {
+               typedef uint64_t value_type;
+               static value_type compare_and_swap(value_type *p, value_type o, value_type n) {
+                       return Atomic_md::compare_and_swap(p, o, n);
+               }
+       };
+
+       template<int N> class CAS_chooser;
+       template<> class CAS_chooser<4> {
+               public:
+                       typedef CAS_32_functor the_type;
+       };
+       template<> class CAS_chooser<8> {
+               public:
+                       typedef CAS_64_functor the_type;
+       };
+
+       template<class T> class CAS {
+               public:
+                       typedef typename CAS_chooser<sizeof(T)>::the_type S;
+                       static T compare_and_swap(T *p, T o, T n) {
+                               return (T) S::compare_and_swap((typename S::value_type*) p,
+                                               (typename S::value_type) o,
+                                               (typename S::value_type) n);
+                       }
+       };
+
+       template<class T> T compare_and_swap(T *p, T o, T n) {
+               return CAS<T>::compare_and_swap(p, o, n);
+       }
+
+       inline void     memory_barrier(void)       { Atomic_md::memory_barrier(); }
+       inline void     write_memory_barrier(void) { Atomic_md::write_memory_barrier(); }
+       inline void     instruction_barrier(void)  { Atomic_md::instruction_barrier(); }
+}
+
 #else
 
 // Legacy C interface.
 
-uint32_t Atomic_compare_and_swap_32(volatile uint32_t *p, uint32_t oldval, uint32_t newval);
-uint64_t Atomic_compare_and_swap_64(volatile uint64_t *p, uint64_t oldval, uint64_t newval);
-void*    Atomic_compare_and_swap_ptr(volatile void** p, void* oldval, void* newval);
+uint32_t Atomic_compare_and_swap_32(uint32_t *p, uint32_t oldval, uint32_t newval);
+uint64_t Atomic_compare_and_swap_64(uint64_t *p, uint64_t oldval, uint64_t newval);
+void*    Atomic_compare_and_swap_ptr(void** p, void* oldval, void* newval);
 void     Atomic_memory_barrier(void);
 void     Atomic_write_memory_barrier(void);
 void     Atomic_instruction_barrier(void);
index 962852a55dfa4b085f73cc0957e789c3ebcf7102..07c3a85428a5c61dd98aeffd3930e9d5b8e91507 100644 (file)
@@ -32,6 +32,7 @@
 
 #include "threads/atomic.hpp"
 
+namespace Atomic_md {
 
 /**
  * An atomic compare and swap for 32-bit integer values.
@@ -42,7 +43,7 @@
  *
  * @return value of the memory location before the store
  */
-inline uint32_t Atomic::compare_and_swap(volatile uint32_t *p, uint32_t oldval, uint32_t newval)
+inline uint32_t compare_and_swap(volatile uint32_t *p, uint32_t oldval, uint32_t newval)
 {
        uint32_t temp;
        uint32_t result;
@@ -72,7 +73,7 @@ inline uint32_t Atomic::compare_and_swap(volatile uint32_t *p, uint32_t oldval,
  *
  * @return value of the memory location before the store
  */
-inline uint64_t Atomic::compare_and_swap(volatile uint64_t *p, uint64_t oldval, uint64_t newval)
+inline uint64_t compare_and_swap(volatile uint64_t *p, uint64_t oldval, uint64_t newval)
 {
        uint64_t temp;
        uint64_t result;
@@ -93,25 +94,10 @@ inline uint64_t Atomic::compare_and_swap(volatile uint64_t *p, uint64_t oldval,
 }
 
 
-/**
- * An atomic compare and swap for pointer values.
- *
- * @param p      Pointer to memory address.
- * @param oldval Old value to be expected.
- * @param newval New value to be stored.
- *
- * @return value of the memory location before the store
- */
-inline void* Atomic::compare_and_swap(volatile void** p, void* oldval, void* newval)
-{
-       return (void*) compare_and_swap((volatile uint64_t*) p, (uint64_t) oldval, (uint64_t) newval);
-}
-
-
 /**
  * A memory barrier.
  */
-inline void Atomic::memory_barrier(void)
+inline void memory_barrier(void)
 {
        __asm__ __volatile__ ("mb" : : : "memory");
 }
@@ -120,7 +106,7 @@ inline void Atomic::memory_barrier(void)
 /**
  * A write memory barrier.
  */
-inline void Atomic::write_memory_barrier(void)
+inline void write_memory_barrier(void)
 {
        __asm__ __volatile__ ("wmb" : : : "memory");
 }
@@ -129,11 +115,13 @@ inline void Atomic::write_memory_barrier(void)
 /**
  * An instruction barrier.
  */
-inline void Atomic::instruction_barrier(void)
+inline void instruction_barrier(void)
 {
        __asm__ __volatile__ ("mb" : : : "memory");
 }
 
+}
+
 #endif // _MD_ATOMIC_HPP
 
 
index 81f0a3926ac8f0db71fe027c9cae9d66a1ed226d..f0e74eaa695b62b92dfdc9ac3bcaad412a77b2a9 100644 (file)
@@ -32,6 +32,7 @@
 
 #include "threads/atomic.hpp"
 
+namespace Atomic_md {
 
 /**
  * An atomic compare and swap for 32-bit integer values.
@@ -42,7 +43,7 @@
  *
  * @return value of the memory location before the store
  */
-inline uint32_t Atomic::compare_and_swap(volatile uint32_t *p, uint32_t oldval, uint32_t newval)
+inline uint32_t compare_and_swap(volatile uint32_t *p, uint32_t oldval, uint32_t newval)
 {
        uint32_t result;
        uint32_t temp;
@@ -76,31 +77,16 @@ inline uint32_t Atomic::compare_and_swap(volatile uint32_t *p, uint32_t oldval,
  *
  * @return value of the memory location before the store
  */
-inline uint64_t Atomic::compare_and_swap(volatile uint64_t *p, uint64_t oldval, uint64_t newval)
+inline uint64_t compare_and_swap(volatile uint64_t *p, uint64_t oldval, uint64_t newval)
 {
-       return generic_compare_and_swap(p, oldval, newval);
-}
-
-
-/**
- * An atomic compare and swap for pointer values.
- *
- * @param p      Pointer to memory address.
- * @param oldval Old value to be expected.
- * @param newval New value to be stored.
- *
- * @return value of the memory location before the store
- */
-inline void* Atomic::compare_and_swap(volatile void** p, void* oldval, void* newval)
-{
-       return (void*) compare_and_swap((volatile uint32_t*) p, (uint32_t) oldval, (uint32_t) newval);
+       return Atomic::generic_compare_and_swap(p, oldval, newval);
 }
 
 
 /**
  * A memory barrier.
  */
-inline void Atomic::memory_barrier(void)
+inline void memory_barrier(void)
 {
        __asm__ __volatile__ ("" : : : "memory");
 }
@@ -109,7 +95,7 @@ inline void Atomic::memory_barrier(void)
 /**
  * A write memory barrier.
  */
-inline void Atomic::write_memory_barrier(void)
+inline void write_memory_barrier(void)
 {
        __asm__ __volatile__ ("" : : : "memory");
 }
@@ -118,11 +104,13 @@ inline void Atomic::write_memory_barrier(void)
 /**
  * An instruction barrier.
  */
-inline void Atomic::instruction_barrier(void)
+inline void instruction_barrier(void)
 {
        __asm__ __volatile__ ("" : : : "memory");
 }
 
+}
+
 #endif // _MD_ATOMIC_HPP
 
 
index 37944004cca43ead30f4dc1f0e3fe6474310c6d0..84f7b3df5e05b255aac0da4bf4a1936b1e3bb0f1 100644 (file)
@@ -32,6 +32,7 @@
 
 #include "threads/atomic.hpp"
 
+namespace Atomic_md {
 
 /**
  * An atomic compare and swap for 32-bit integer values.
@@ -42,7 +43,7 @@
  *
  * @return value of the memory location before the store
  */
-inline uint32_t Atomic::compare_and_swap(volatile uint32_t *p, uint32_t oldval, uint32_t newval)
+inline uint32_t compare_and_swap(volatile uint32_t *p, uint32_t oldval, uint32_t newval)
 {
        uint32_t result;
 
@@ -64,32 +65,17 @@ inline uint32_t Atomic::compare_and_swap(volatile uint32_t *p, uint32_t oldval,
  *
  * @return value of the memory location before the store
  */
-inline uint64_t Atomic::compare_and_swap(volatile uint64_t *p, uint64_t oldval, uint64_t newval)
+inline uint64_t compare_and_swap(volatile uint64_t *p, uint64_t oldval, uint64_t newval)
 {
 #warning Should we use cmpxchg8b or a generic version?
-       return generic_compare_and_swap(p, oldval, newval);
-}
-
-
-/**
- * An atomic compare and swap for pointer values.
- *
- * @param p      Pointer to memory address.
- * @param oldval Old value to be expected.
- * @param newval New value to be stored.
- *
- * @return value of the memory location before the store
- */
-inline void* Atomic::compare_and_swap(volatile void** p, void* oldval, void* newval)
-{
-       return (void*) compare_and_swap((volatile uint32_t*) p, (uint32_t) oldval, (uint32_t) newval);
+       return Atomic::generic_compare_and_swap(p, oldval, newval);
 }
 
 
 /**
  * A memory barrier.
  */
-inline void Atomic::memory_barrier(void)
+inline void memory_barrier(void)
 {
        __asm__ __volatile__ ("lock; add $0, 0(%%esp)" : : : "memory" );
 }
@@ -98,7 +84,7 @@ inline void Atomic::memory_barrier(void)
 /**
  * A write memory barrier.
  */
-inline void Atomic::write_memory_barrier(void)
+inline void write_memory_barrier(void)
 {
        __asm__ __volatile__ ("" : : : "memory");
 }
@@ -107,13 +93,15 @@ inline void Atomic::write_memory_barrier(void)
 /**
  * An instruction barrier.
  */
-inline void Atomic::instruction_barrier(void)
+inline void instruction_barrier(void)
 {
        // We need the "memory" constraint here because compare_and_swap does not
        // have it.
        __asm__ __volatile__ ("" : : : "memory");
 }
 
+}
+
 #endif // _MD_ATOMIC_HPP
 
 
index ad5d4d247bd84d6abe7434ee5ff35b670e40d6f5..5ed395ea2f15db20ee1739f5a03c308e593bed24 100644 (file)
@@ -32,6 +32,7 @@
 
 #include "threads/atomic.hpp"
 
+namespace Atomic_md {
 
 /**
  * An atomic compare and swap for 32-bit integer values.
@@ -42,9 +43,9 @@
  *
  * @return value of the memory location before the store
  */
-inline uint32_t Atomic::compare_and_swap(volatile uint32_t *p, uint32_t oldval, uint32_t newval)
+inline uint32_t compare_and_swap(volatile uint32_t *p, uint32_t oldval, uint32_t newval)
 {
-       return generic_compare_and_swap(p, oldval, newval);
+       return Atomic::generic_compare_and_swap(p, oldval, newval);
 }
 
 
@@ -57,31 +58,16 @@ inline uint32_t Atomic::compare_and_swap(volatile uint32_t *p, uint32_t oldval,
  *
  * @return value of the memory location before the store
  */
-inline uint64_t Atomic::compare_and_swap(volatile uint64_t *p, uint64_t oldval, uint64_t newval)
+inline uint64_t compare_and_swap(volatile uint64_t *p, uint64_t oldval, uint64_t newval)
 {
-       return generic_compare_and_swap(p, oldval, newval);
-}
-
-
-/**
- * An atomic compare and swap for pointer values.
- *
- * @param p      Pointer to memory address.
- * @param oldval Old value to be expected.
- * @param newval New value to be stored.
- *
- * @return value of the memory location before the store
- */
-inline void* Atomic::compare_and_swap(volatile void** p, void* oldval, void* newval)
-{
-       return generic_compare_and_swap(p, oldval, newval);
+       return Atomic::generic_compare_and_swap(p, oldval, newval);
 }
 
 
 /**
  * A memory barrier.
  */
-inline void Atomic::memory_barrier(void)
+inline void memory_barrier(void)
 {
        generic_memory_barrier();
 }
@@ -90,7 +76,7 @@ inline void Atomic::memory_barrier(void)
 /**
  * A write memory barrier.
  */
-inline void Atomic::write_memory_barrier(void)
+inline void write_memory_barrier(void)
 {
        __asm__ __volatile__ ("" : : : "memory");
 }
@@ -99,11 +85,13 @@ inline void Atomic::write_memory_barrier(void)
 /**
  * An instruction barrier.
  */
-inline void Atomic::instruction_barrier(void)
+inline void instruction_barrier(void)
 {
        __asm__ __volatile__ ("" : : : "memory");
 }
 
+}
+
 #endif // _MD_ATOMIC_HPP
 
 
index 5cf0a3ef3ab059ca9d7ba0127c150d80b096f699..a099a99a132690a18fc275c06b9ecfc270f9a47e 100644 (file)
@@ -32,6 +32,7 @@
 
 #include "threads/atomic.hpp"
 
+namespace Atomic_md {
 
 /**
  * An atomic compare and swap for 32-bit integer values.
@@ -42,7 +43,7 @@
  *
  * @return value of the memory location before the store
  */
-inline uint32_t Atomic::compare_and_swap(volatile uint32_t *p, uint32_t oldval, uint32_t newval)
+inline uint32_t compare_and_swap(volatile uint32_t *p, uint32_t oldval, uint32_t newval)
 {
        uint32_t result;
        uint32_t temp;
@@ -75,7 +76,7 @@ inline uint32_t Atomic::compare_and_swap(volatile uint32_t *p, uint32_t oldval,
  *
  * @return value of the memory location before the store
  */
-inline uint64_t Atomic::compare_and_swap(volatile uint64_t *p, uint64_t oldval, uint64_t newval)
+inline uint64_t compare_and_swap(volatile uint64_t *p, uint64_t oldval, uint64_t newval)
 {
 #if SIZEOF_VOID_P == 8
        uint64_t result;
@@ -98,26 +99,7 @@ inline uint64_t Atomic::compare_and_swap(volatile uint64_t *p, uint64_t oldval,
 
        return result;
 #else
-       return generic_compare_and_swap(p, oldval, newval);
-#endif
-}
-
-
-/**
- * An atomic compare and swap for pointer values.
- *
- * @param p      Pointer to memory address.
- * @param oldval Old value to be expected.
- * @param newval New value to be stored.
- *
- * @return value of the memory location before the store
- */
-inline void* Atomic::compare_and_swap(volatile void** p, void* oldval, void* newval)
-{
-#if SIZEOF_VOID_P == 8
-       return (void*) compare_and_swap((volatile uint64_t*) p, (uint64_t) oldval, (uint64_t) newval);
-#else
-       return (void*) compare_and_swap((volatile uint32_t*) p, (uint32_t) oldval, (uint32_t) newval);
+       return Atomic::generic_compare_and_swap(p, oldval, newval);
 #endif
 }
 
@@ -125,7 +107,7 @@ inline void* Atomic::compare_and_swap(volatile void** p, void* oldval, void* new
 /**
  * A memory barrier.
  */
-inline void Atomic::memory_barrier(void)
+inline void memory_barrier(void)
 {
        __asm__ __volatile__ ("" : : : "memory");
 }
@@ -134,7 +116,7 @@ inline void Atomic::memory_barrier(void)
 /**
  * A write memory barrier.
  */
-inline void Atomic::write_memory_barrier(void)
+inline void write_memory_barrier(void)
 {
        __asm__ __volatile__ ("" : : : "memory");
 }
@@ -143,11 +125,13 @@ inline void Atomic::write_memory_barrier(void)
 /**
  * An instruction barrier.
  */
-inline void Atomic::instruction_barrier(void)
+inline void instruction_barrier(void)
 {
        __asm__ __volatile__ ("" : : : "memory");
 }
 
+}
+
 #endif // _MD_ATOMIC_HPP
 
 
index 09a3533e85fb580f1160f9556a2f939866007303..e6240f9097f4786deee3574cc75bff1f587365c9 100644 (file)
@@ -32,6 +32,7 @@
 
 #include "threads/atomic.hpp"
 
+namespace Atomic_md {
 
 /**
  * An atomic compare and swap for 32-bit integer values.
@@ -42,7 +43,7 @@
  *
  * @return value of the memory location before the store
  */
-inline uint32_t Atomic::compare_and_swap(volatile uint32_t *p, uint32_t oldval, uint32_t newval)
+inline uint32_t compare_and_swap(volatile uint32_t *p, uint32_t oldval, uint32_t newval)
 {
        uint32_t temp;
        uint32_t result;
@@ -73,31 +74,16 @@ inline uint32_t Atomic::compare_and_swap(volatile uint32_t *p, uint32_t oldval,
  *
  * @return value of the memory location before the store
  */
-inline uint64_t Atomic::compare_and_swap(volatile uint64_t *p, uint64_t oldval, uint64_t newval)
+inline uint64_t compare_and_swap(volatile uint64_t *p, uint64_t oldval, uint64_t newval)
 {
        return Atomic::generic_compare_and_swap(p, oldval, newval);
 }
 
 
-/**
- * An atomic compare and swap for pointer values.
- *
- * @param p      Pointer to memory address.
- * @param oldval Old value to be expected.
- * @param newval New value to be stored.
- *
- * @return value of the memory location before the store
- */
-inline void* Atomic::compare_and_swap(volatile void** p, void* oldval, void* newval)
-{
-       return (void*) compare_and_swap((volatile uint32_t*) p, (uint32_t) oldval, (uint32_t) newval);
-}
-
-
 /**
  * A memory barrier.
  */
-inline void Atomic::memory_barrier(void)
+inline void memory_barrier(void)
 {
        __asm__ __volatile__ ("sync" : : : "memory");
 }
@@ -106,7 +92,7 @@ inline void Atomic::memory_barrier(void)
 /**
  * A write memory barrier.
  */
-inline void Atomic::write_memory_barrier(void)
+inline void write_memory_barrier(void)
 {
        __asm__ __volatile__ ("" : : : "memory");
 }
@@ -114,11 +100,13 @@ inline void Atomic::write_memory_barrier(void)
 /**
  * An instruction barrier.
  */
-inline void Atomic::instruction_barrier(void)
+inline void instruction_barrier(void)
 {
        __asm__ __volatile__ ("isync" : : : "memory");
 }
 
+}
+
 #endif // _MD_ATOMIC_HPP
 
 
index f469e7515f61b9fccbbd5557311c022ccb9a722c..a72f184100150fb3729ba6657010d7e512d8c54e 100644 (file)
@@ -32,6 +32,7 @@
 
 #include "threads/atomic.hpp"
 
+namespace Atomic_md {
 
 /**
  * An atomic compare and swap for 32-bit integer values.
@@ -42,7 +43,7 @@
  *
  * @return value of the memory location before the store
  */
-inline uint32_t Atomic::compare_and_swap(volatile uint32_t *p, uint32_t oldval, uint32_t newval)
+inline uint32_t compare_and_swap(volatile uint32_t *p, uint32_t oldval, uint32_t newval)
 {
        uint32_t temp;
        uint32_t result;
@@ -73,7 +74,7 @@ inline uint32_t Atomic::compare_and_swap(volatile uint32_t *p, uint32_t oldval,
  *
  * @return value of the memory location before the store
  */
-inline uint64_t Atomic::compare_and_swap(volatile uint64_t *p, uint64_t oldval, uint64_t newval)
+inline uint64_t compare_and_swap(volatile uint64_t *p, uint64_t oldval, uint64_t newval)
 {
        uint64_t temp;
        uint64_t result;
@@ -95,25 +96,10 @@ inline uint64_t Atomic::compare_and_swap(volatile uint64_t *p, uint64_t oldval,
 }
 
 
-/**
- * An atomic compare and swap for pointer values.
- *
- * @param p      Pointer to memory address.
- * @param oldval Old value to be expected.
- * @param newval New value to be stored.
- *
- * @return value of the memory location before the store
- */
-inline void* Atomic::compare_and_swap(volatile void** p, void* oldval, void* newval)
-{
-       return (void*) compare_and_swap((volatile uint64_t*) p, (uint64_t) oldval, (uint64_t) newval);
-}
-
-
 /**
  * A memory barrier.
  */
-inline void Atomic::memory_barrier(void)
+inline void memory_barrier(void)
 {
        __asm__ __volatile__ ("sync" : : : "memory");
 }
@@ -122,7 +108,7 @@ inline void Atomic::memory_barrier(void)
 /**
  * A write memory barrier.
  */
-inline void Atomic::write_memory_barrier(void)
+inline void write_memory_barrier(void)
 {
        __asm__ __volatile__ ("" : : : "memory");
 }
@@ -131,11 +117,13 @@ inline void Atomic::write_memory_barrier(void)
 /**
  * An instruction memory barrier.
  */
-inline void Atomic::instruction_barrier(void)
+inline void instruction_barrier(void)
 {
        __asm__ __volatile__ ("isync" : : : "memory");
 }
 
+}
+
 #endif // _MD_ATOMIC_HPP
 
 
index fafb6426de1f2491eeafbcf24e3211432e766915..7780ede7cdfe35d68c046f9cf30c1bac254d2f5e 100644 (file)
@@ -32,6 +32,7 @@
 
 #include "threads/atomic.hpp"
 
+namespace Atomic_md {
 
 /**
  * An atomic compare and swap for 32-bit integer values.
@@ -42,7 +43,7 @@
  *
  * @return value of the memory location before the store
  */
-inline uint32_t Atomic::compare_and_swap(volatile uint32_t *p, uint32_t oldval, uint32_t newval)
+inline uint32_t ompare_and_swap(volatile uint32_t *p, uint32_t oldval, uint32_t newval)
 {
        __asm__ __volatile__ (
                "cs %0,%3,0(%2)\n"
@@ -63,31 +64,16 @@ inline uint32_t Atomic::compare_and_swap(volatile uint32_t *p, uint32_t oldval,
  *
  * @return value of the memory location before the store
  */
-inline uint64_t Atomic::compare_and_swap(volatile uint64_t *p, uint64_t oldval, uint64_t newval)
+inline uint64_t ompare_and_swap(volatile uint64_t *p, uint64_t oldval, uint64_t newval)
 {
-       return generic_compare_and_swap(p, oldval, newval);
-}
-
-
-/**
- * An atomic compare and swap for pointer values.
- *
- * @param p      Pointer to memory address.
- * @param oldval Old value to be expected.
- * @param newval New value to be stored.
- *
- * @return value of the memory location before the store
- */
-inline void* Atomic::compare_and_swap(volatile void** p, void* oldval, void* newval)
-{
-       return (void*) compare_and_swap((volatile uint32_t*) p, (uint32_t) oldval, (uint32_t) newval);
+       return Atomic::generic_compare_and_swap(p, oldval, newval);
 }
 
 
 /**
  * A memory barrier.
  */
-inline void Atomic::memory_barrier(void)
+inline void emory_barrier(void)
 {
        __asm__ __volatile__ ("bcr 15,0" : : : "memory" );
 }
@@ -96,7 +82,7 @@ inline void Atomic::memory_barrier(void)
 /**
  * A write memory barrier.
  */
-inline void Atomic::write_memory_barrier(void)
+inline void rite_memory_barrier(void)
 {
        memory_barrier();
 }
@@ -104,11 +90,13 @@ inline void Atomic::write_memory_barrier(void)
 /**
  * An instruction barrier.
  */
-inline void Atomic::instruction_barrier(void)
+inline void nstruction_barrier(void)
 {
        memory_barrier();
 }
 
+}
+
 #endif // _MD_ATOMIC_HPP
 
 
index 5539c38db0e0b04f22fa4199b4c3a4dc42617ee4..3822152f1f364e583ec1688529c89b2d1c17c757 100644 (file)
@@ -32,6 +32,7 @@
 
 #include "threads/atomic.hpp"
 
+namespace Atomic_md {
 
 /**
  * An atomic compare and swap for 32-bit integer values.
@@ -42,7 +43,9 @@
  *
  * @return value of the memory location before the store
  */
-inline uint32_t Atomic::compare_and_swap(volatile uint32_t *p, uint32_t oldval, uint32_t newval)
+inline uint32_t compare_and_swap(volatile uint32_t *p, uint32_t oldval, uint32_t newval)
+
+}
 {
 #if 0
        // This one should be correct.
@@ -56,7 +59,7 @@ inline uint32_t Atomic::compare_and_swap(volatile uint32_t *p, uint32_t oldval,
 
        return result;
 #else
-       return generic_compare_and_swap(p, oldval, newval);
+       return Atomic::generic_compare_and_swap(p, oldval, newval);
 #endif
 }
 
@@ -70,7 +73,7 @@ inline uint32_t Atomic::compare_and_swap(volatile uint32_t *p, uint32_t oldval,
  *
  * @return value of the memory location before the store
  */
-inline uint64_t Atomic::compare_and_swap(volatile uint64_t *p, uint64_t oldval, uint64_t newval)
+inline uint64_t compare_and_swap(volatile uint64_t *p, uint64_t oldval, uint64_t newval)
 {
        uint64_t result;
 
@@ -84,25 +87,10 @@ inline uint64_t Atomic::compare_and_swap(volatile uint64_t *p, uint64_t oldval,
 }
 
 
-/**
- * An atomic compare and swap for pointer values.
- *
- * @param p      Pointer to memory address.
- * @param oldval Old value to be expected.
- * @param newval New value to be stored.
- *
- * @return value of the memory location before the store
- */
-inline void* Atomic::compare_and_swap(volatile void** p, void* oldval, void* newval)
-{
-       return (void*) compare_and_swap((volatile uint64_t*) p, (uint64_t) oldval, (uint64_t) newval);
-}
-
-
 /**
  * A memory barrier.
  */
-inline void Atomic::memory_barrier(void)
+inline void memory_barrier(void)
 {
        __asm__ __volatile__ ("membar 0x0F" : : : "memory" );
 }
@@ -111,7 +99,7 @@ inline void Atomic::memory_barrier(void)
 /**
  * A write memory barrier.
  */
-inline void Atomic::write_memory_barrier(void)
+inline void write_memory_barrier(void)
 {
        __asm__ __volatile__ ("wmb" : : : "memory");
 }
@@ -120,11 +108,13 @@ inline void Atomic::write_memory_barrier(void)
 /**
  * An instruction barrier.
  */
-inline void Atomic::instruction_barrier(void)
+inline void instruction_barrier(void)
 {
        __asm__ __volatile__ ("mb" : : : "memory");
 }
 
+}
+
 #endif // _MD_ATOMIC_HPP
 
 
index 74e6b707abca71151001a83e867fc67dbd75d337..d5d98a0c270ce3c0d0baee35e953d8d082e3fcdf 100644 (file)
@@ -32,6 +32,7 @@
 
 #include "threads/atomic.hpp"
 
+namespace Atomic_md {
 
 /**
  * An atomic compare and swap for 32-bit integer values.
@@ -42,7 +43,7 @@
  *
  * @return value of the memory location before the store
  */
-inline uint32_t Atomic::compare_and_swap(volatile uint32_t *p, uint32_t oldval, uint32_t newval)
+inline uint32_t compare_and_swap(volatile uint32_t *p, uint32_t oldval, uint32_t newval)
 {
        uint32_t result;
 
@@ -64,7 +65,7 @@ inline uint32_t Atomic::compare_and_swap(volatile uint32_t *p, uint32_t oldval,
  *
  * @return value of the memory location before the store
  */
-inline uint64_t Atomic::compare_and_swap(volatile uint64_t *p, uint64_t oldval, uint64_t newval)
+inline uint64_t compare_and_swap(volatile uint64_t *p, uint64_t oldval, uint64_t newval)
 {
        uint64_t result;
 
@@ -77,25 +78,10 @@ inline uint64_t Atomic::compare_and_swap(volatile uint64_t *p, uint64_t oldval,
 }
 
 
-/**
- * An atomic compare and swap for pointer values.
- *
- * @param p      Pointer to memory address.
- * @param oldval Old value to be expected.
- * @param newval New value to be stored.
- *
- * @return value of the memory location before the store
- */
-inline void* Atomic::compare_and_swap(volatile void** p, void* oldval, void* newval)
-{
-       return (void*) compare_and_swap((volatile uint64_t*) p, (uint64_t) oldval, (uint64_t) newval);
-}
-
-
 /**
  * A memory barrier.
  */
-inline void Atomic::memory_barrier(void)
+inline void memory_barrier(void)
 {
        __asm__ __volatile__ ("mfence" : : : "memory");
 }
@@ -104,7 +90,7 @@ inline void Atomic::memory_barrier(void)
 /**
  * A write memory barrier.
  */
-inline void Atomic::write_memory_barrier(void)
+inline void write_memory_barrier(void)
 {
        __asm__ __volatile__ ("" : : : "memory");
 }
@@ -113,13 +99,15 @@ inline void Atomic::write_memory_barrier(void)
 /**
  * An instruction barrier.
  */
-inline void Atomic::instruction_barrier(void)
+inline void instruction_barrier(void)
 {
        // We need the "memory" constraint here because compare_and_swap does not
        // have it.
        __asm__ __volatile__ ("" : : : "memory");
 }
 
+}
+
 #endif // _MD_ATOMIC_HPP