RISC-V/V203F6P6/common/atomic.h

24 lines
1 KiB
C
Raw Normal View History

2025-02-20 22:07:45 +01:00
#ifndef _ATOMIC_H_DEF_
#define _ATOMIC_H_DEF_
#define WR_MEMORDER __ATOMIC_SEQ_CST
#define RD_MEMORDER __ATOMIC_SEQ_CST
/* Velmi zjednodušené, ale v zásadě funkční.
* Asi to bude nutné trochu rozšířit, ale zatím to nebudu komplikovat.
* Použity jsou interní funkce gcc (clang), takže to není závislé na
* architektuře.
* */
template<class T> class atomic {
volatile T data;
public:
explicit atomic () noexcept : data( ) {}
explicit atomic (const T & v) noexcept : data(v) {}
atomic & operator= (volatile T & v) { __atomic_store_n (& data, v, WR_MEMORDER); return * this; }
atomic & operator= (const T & v) { __atomic_store_n (& data, v, WR_MEMORDER); return * this; }
operator T () const { return __atomic_load_n (& data, RD_MEMORDER); }
atomic & operator+= (const T & v) { __atomic_add_fetch (& data, v, WR_MEMORDER); return * this; }
atomic & operator-= (const T & v) { __atomic_sub_fetch (& data, v, WR_MEMORDER); return * this; }
};
#endif // _ATOMIC_H_DEF_