40 lines
1.4 KiB
C++
40 lines
1.4 KiB
C++
#define FACTOR_FORCE_INLINE __attribute__((always_inline)) inline
|
|
namespace factor {
|
|
namespace atomic {
|
|
__attribute__((always_inline)) inline static bool cas(volatile cell* ptr,
|
|
cell old_val,
|
|
cell new_val) {
|
|
return __sync_bool_compare_and_swap(ptr, old_val, new_val);
|
|
}
|
|
__attribute__((always_inline)) inline static bool cas(volatile fixnum* ptr,
|
|
fixnum old_val,
|
|
fixnum new_val) {
|
|
return __sync_bool_compare_and_swap(ptr, old_val, new_val);
|
|
}
|
|
|
|
__attribute__((always_inline)) inline static cell fetch_add(volatile cell* ptr,
|
|
cell val) {
|
|
return __sync_fetch_and_add(ptr, val);
|
|
}
|
|
__attribute__((always_inline)) inline static fixnum fetch_add(
|
|
volatile fixnum* ptr, fixnum val) {
|
|
return __sync_fetch_and_add(ptr, val);
|
|
}
|
|
|
|
__attribute__((always_inline)) inline static cell fetch_subtract(
|
|
volatile cell* ptr, cell val) {
|
|
return __sync_fetch_and_sub(ptr, val);
|
|
}
|
|
__attribute__((always_inline)) inline static fixnum fetch_subtract(
|
|
volatile fixnum* ptr, fixnum val) {
|
|
return __sync_fetch_and_sub(ptr, val);
|
|
}
|
|
|
|
__attribute__((always_inline)) inline static void fence() {
|
|
__sync_synchronize();
|
|
}
|
|
}
|
|
}
|
|
|
|
#include "atomic.hpp"
|