]> gitweb.factorcode.org Git - factor.git/blob - vm/atomic-gcc.hpp
vm: add atomic::load and atomic::store functions
[factor.git] / vm / atomic-gcc.hpp
1 #define FACTOR_FORCE_INLINE __attribute__((always_inline)) inline
2 namespace factor {
3         namespace atomic {
4                 __attribute__((always_inline))
5                 inline static bool cas(volatile cell *ptr, cell old_val, cell new_val)
6                 {
7                         return __sync_bool_compare_and_swap(ptr, old_val, new_val);
8                 }
9                 __attribute__((always_inline))
10                 inline static bool cas(volatile fixnum *ptr, fixnum old_val, fixnum new_val)
11                 {
12                         return __sync_bool_compare_and_swap(ptr, old_val, new_val);
13                 }
14
15                 __attribute__((always_inline))
16                 inline static cell add(volatile cell *ptr, cell val)
17                 {
18                         return __sync_add_and_fetch(ptr, val);
19                 }
20                 __attribute__((always_inline))
21                 inline static fixnum add(volatile fixnum *ptr, fixnum val)
22                 {
23                         return __sync_add_and_fetch(ptr, val);
24                 }
25
26                 __attribute__((always_inline))
27                 inline static cell subtract(volatile cell *ptr, cell val)
28                 {
29                         return __sync_sub_and_fetch(ptr, val);
30                 }
31                 __attribute__((always_inline))
32                 inline static fixnum subtract(volatile fixnum *ptr, fixnum val)
33                 {
34                         return __sync_sub_and_fetch(ptr, val);
35                 }
36
37                 __attribute__((always_inline))
38                 inline static void fence()
39                 {
40                         __sync_synchronize();
41                 }
42         }
43 }
44
45 #include "atomic.hpp"