* src/threads/atomic.cpp: New file.
[cacao.git] / src / threads / atomic.hpp
index 10937138d686f3af26076b55857d2b938d3f9f54..382a8724bc2b5e3b7c1c9f60f02d7c32bef3a4ad 100644 (file)
 
 #include <stdint.h>
 
-uint32_t Atomic_generic_compare_and_swap_32(volatile uint32_t *p, uint32_t oldval, uint32_t newval);
-uint64_t Atomic_generic_compare_and_swap_64(volatile uint64_t *p, uint64_t oldval, uint64_t newval);
-void*    Atomic_generic_compare_and_swap_ptr(volatile void** p, void* oldval, void* newval);
-void     Atomic_generic_memory_barrier(void);
+#ifdef __cplusplus
+
+class Atomic {
+public:
+       // 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);
+
+       // 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"
 
-#endif /* _ATOMIC_HPP */
+#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);
+void     Atomic_memory_barrier(void);
+void     Atomic_write_memory_barrier(void);
+void     Atomic_instruction_barrier(void);
+
+#endif
+
+#endif // _ATOMIC_HPP
 
 
 /*