diff --git a/arch/arch.h b/arch/arch.h index a25779d4fd..fca003beab 100644 --- a/arch/arch.h +++ b/arch/arch.h @@ -1,7 +1,11 @@ #ifndef ARCH_H #define ARCH_H +#ifdef __cplusplus +#include +#else #include +#endif #include "../lib/types.h" @@ -36,6 +40,21 @@ extern unsigned long arch_flags; #define ARCH_CPU_CLOCK_WRAPS +#ifdef __cplusplus +#define atomic_add(p, v) \ + std::atomic_fetch_add(p, (v)) +#define atomic_sub(p, v) \ + std::atomic_fetch_sub(p, (v)) +#define atomic_load_relaxed(p) \ + std::atomic_load_explicit(p, \ + std::memory_order_relaxed) +#define atomic_load_acquire(p) \ + std::atomic_load_explicit(p, \ + std::memory_order_acquire) +#define atomic_store_release(p, v) \ + std::atomic_store_explicit(p, (v), \ + std::memory_order_release) +#else #define atomic_add(p, v) \ atomic_fetch_add((_Atomic typeof(*(p)) *)(p), v) #define atomic_sub(p, v) \ @@ -49,6 +68,7 @@ extern unsigned long arch_flags; #define atomic_store_release(p, v) \ atomic_store_explicit((_Atomic typeof(*(p)) *)(p), (v), \ memory_order_release) +#endif /* IWYU pragma: begin_exports */ #if defined(__i386__) diff --git a/lib/seqlock.h b/lib/seqlock.h index 56f3e37dab..ef3aa0918d 100644 --- a/lib/seqlock.h +++ b/lib/seqlock.h @@ -5,7 +5,11 @@ #include "../arch/arch.h" struct seqlock { +#ifdef __cplusplus + std::atomic sequence; +#else volatile unsigned int sequence; +#endif }; static inline void seqlock_init(struct seqlock *s)