35
/* YES. I know these are semantically backwards...
36
* so... TODO: Ensure we're doing the "right" thing here
35
inline value_type add_and_fetch(volatile value_type *value, D addend )
37
return __sync_add_and_fetch(value, addend);
38
40
inline value_type fetch_and_add(volatile value_type *value, D addend )
40
return __sync_add_and_fetch(value, addend);
42
return __sync_fetch_and_add(value, addend);
43
45
inline value_type fetch_and_increment(volatile value_type *value)
45
return __sync_add_and_fetch(value, 1);
47
return __sync_fetch_and_add(value, 1);
48
50
inline value_type fetch_and_decrement(volatile value_type *value)
50
return __sync_sub_and_fetch(value, 1);
52
return __sync_fetch_and_sub(value, 1);
53
55
inline value_type fetch_and_store(volatile value_type *value,
54
56
value_type new_value)
56
/* TODO: Is this the right one? */
57
58
return __sync_lock_test_and_set(value, new_value);
60
inline value_type compare_and_swap(volatile value_type *value,
61
inline bool compare_and_swap(volatile value_type *value,
61
62
value_type new_value,
62
63
value_type comparand )
64
return __sync_val_compare_and_swap(value, comparand, new_value);
65
return __sync_bool_compare_and_swap(value, comparand, new_value);
67
68
inline value_type fetch(const volatile value_type *value) const volatile
76
77
* Look at how to rewrite the below to something that ICC feels is
77
78
* OK and yet respects memory barriers.
79
return __sync_add_and_fetch(const_cast<value_type *>(value), 0);
80
return __sync_fetch_and_add(const_cast<value_type *>(value), 0);
82
83
inline value_type store_with_release(volatile value_type *value,