Experimental atomic_gcc_sync change

This commit is contained in:
John Wellbelove 2020-08-04 11:57:53 +01:00
parent 08fc80a2c5
commit b92c3e8a1f

View File

@ -61,6 +61,9 @@ namespace etl
memory_order_seq_cst
} memory_order;
//***************************************************************************
/// For all types except pointers
//***************************************************************************
template <typename T>
class atomic
{
@ -436,18 +439,21 @@ namespace etl
mutable volatile T value;
};
//***************************************************************************
/// Specialisation for pointers
//***************************************************************************
template <typename T>
class atomic<T*>
{
public:
atomic()
: value(ETL_NULLPTR)
: value(0U)
{
}
atomic(T* v)
: value(v)
: value(uintptr_t(v))
{
}
@ -469,7 +475,7 @@ namespace etl
// Pre-increment
T* operator ++()
{
return (T*)__sync_add_and_fetch(&(volatile void*)value, sizeof(T));
return (T*)__sync_add_and_fetch(&value, sizeof(T));
}
T* operator ++() volatile
@ -540,7 +546,7 @@ namespace etl
operator T*() volatile const
{
return __sync_fetch_and_add(&value, 0);
return (T*)__sync_fetch_and_add(&value, 0);
}
// Is lock free?
@ -557,12 +563,12 @@ namespace etl
// Store
void store(T* v, etl::memory_order order = etl::memory_order_seq_cst)
{
__sync_lock_test_and_set(&value, v);
__sync_lock_test_and_set(&value, uintptr_t(v));
}
void store(T* v, etl::memory_order order = etl::memory_order_seq_cst) volatile
{
__sync_lock_test_and_set(&value, v);
__sync_lock_test_and_set(&value, uintptr_t(v));
}
// Load
@ -612,7 +618,7 @@ namespace etl
// Compare exchange weak
bool compare_exchange_weak(T*& expected, T* desired, etl::memory_order order = etl::memory_order_seq_cst)
{
T* old = __sync_val_compare_and_swap(&value, expected, desired);
T* old = (T*)__sync_val_compare_and_swap(&value, uintptr_t(expected), uintptr_t(desired));
if (old == expected)
{
@ -627,7 +633,7 @@ namespace etl
bool compare_exchange_weak(T*& expected, T* desired, etl::memory_order order = etl::memory_order_seq_cst) volatile
{
T* old = __sync_val_compare_and_swap(&value, expected, desired);
T* old = (T*)__sync_val_compare_and_swap(&value, uintptr_t(expected), uintptr_t(desired));
if (old == expected)
{
@ -642,7 +648,7 @@ namespace etl
bool compare_exchange_weak(T*& expected, T* desired, etl::memory_order success, etl::memory_order failure)
{
T* old = __sync_val_compare_and_swap(&value, expected, desired);
T* old = (T*)__sync_val_compare_and_swap(&value, uintptr_t(expected), uintptr_t(desired));
if (old == expected)
{
@ -657,7 +663,7 @@ namespace etl
bool compare_exchange_weak(T*& expected, T* desired, etl::memory_order success, etl::memory_order failure) volatile
{
T* old = __sync_val_compare_and_swap(&value, expected, desired);
T* old = (T*)__sync_val_compare_and_swap(&value, uintptr_t(expected), uintptr_t(desired));
if (old == expected)
{
@ -740,7 +746,7 @@ namespace etl
atomic& operator =(const atomic&);
atomic& operator =(const atomic&) volatile;
mutable volatile T* value;
mutable volatile uintptr_t value;
};
typedef etl::atomic<char> atomic_char;