43 lines
1.1 KiB
C++
43 lines
1.1 KiB
C++
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 add(volatile cell *ptr, cell val)
|
|
{
|
|
return __sync_add_and_fetch(ptr, val);
|
|
}
|
|
__attribute__((always_inline))
|
|
inline static fixnum add(volatile fixnum *ptr, fixnum val)
|
|
{
|
|
return __sync_add_and_fetch(ptr, val);
|
|
}
|
|
|
|
__attribute__((always_inline))
|
|
inline static cell subtract(volatile cell *ptr, cell val)
|
|
{
|
|
return __sync_sub_and_fetch(ptr, val);
|
|
}
|
|
__attribute__((always_inline))
|
|
inline static fixnum subtract(volatile fixnum *ptr, fixnum val)
|
|
{
|
|
return __sync_sub_and_fetch(ptr, val);
|
|
}
|
|
|
|
__attribute__((always_inline))
|
|
inline static void fence()
|
|
{
|
|
__sync_synchronize();
|
|
}
|
|
}
|
|
}
|