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