X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fthreads%2Fatomic.cpp;h=b87b28cc5dabff3a67ef51fb3cbb4385c37fbc40;hb=03349a3953e0f217d686d88b99fa176509a27559;hp=e5ca7c8066b714c84761c19bb465a83da4bbfc69;hpb=0ce178c56bb73f85555e1693ed2019387838b362;p=cacao.git diff --git a/src/threads/atomic.cpp b/src/threads/atomic.cpp index e5ca7c806..b87b28cc5 100644 --- a/src/threads/atomic.cpp +++ b/src/threads/atomic.cpp @@ -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; @@ -115,7 +116,7 @@ void* Atomic::generic_compare_and_swap(volatile void** p, void* oldval, void* ne if (oldval == result) *p = newval; - lock.lock(); + lock.unlock(); return 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(); }