1/*
2 * Copyright 2014, Haiku, Inc.
3 * Distributed under the terms of the MIT License.
4 *
5 */
6
7#include <atomic>
8#include <sys/types.h>
9
10
11extern "C" [[gnu::optimize("omit-frame-pointer")]] void
12atomic_set(int32_t* ptr, int32_t value)
13{
14	auto& obj = *reinterpret_cast<std::atomic<int32_t>*>(ptr);
15	obj.store(value, std::memory_order_release);
16}
17
18
19extern "C" [[gnu::optimize("omit-frame-pointer")]] int32_t
20atomic_get_and_set(int32_t* ptr, int32_t value)
21{
22	auto& obj = *reinterpret_cast<std::atomic<int32_t>*>(ptr);
23	return obj.exchange(value);
24}
25
26
27extern "C" [[gnu::optimize("omit-frame-pointer")]] int32_t
28atomic_test_and_set(int32_t* ptr, int32_t desired, int32_t expected)
29{
30	auto& obj = *reinterpret_cast<std::atomic<int32_t>*>(ptr);
31	obj.compare_exchange_strong(expected, desired);
32	return expected;
33}
34
35
36extern "C" [[gnu::optimize("omit-frame-pointer")]] int32_t
37atomic_add(int32_t* ptr, int32_t value)
38{
39	auto& obj = *reinterpret_cast<std::atomic<int32_t>*>(ptr);
40	return obj.fetch_add(value);
41}
42
43
44extern "C" [[gnu::optimize("omit-frame-pointer")]] int32_t
45atomic_and(int32_t* ptr, int32_t value)
46{
47	auto& obj = *reinterpret_cast<std::atomic<int32_t>*>(ptr);
48	return obj.fetch_and(value);
49}
50
51
52extern "C" [[gnu::optimize("omit-frame-pointer")]] int32_t
53atomic_or(int32_t* ptr, int32_t value)
54{
55	auto& obj = *reinterpret_cast<std::atomic<int32_t>*>(ptr);
56	return obj.fetch_or(value);
57}
58
59
60extern "C" [[gnu::optimize("omit-frame-pointer")]] int32_t
61atomic_get(int32_t* ptr)
62{
63	auto& obj = *reinterpret_cast<std::atomic<int32_t>*>(ptr);
64	return obj.load(std::memory_order_acquire);
65}
66
67
68extern "C" [[gnu::optimize("omit-frame-pointer")]] void
69atomic_set64(int64_t* ptr, int64_t value)
70{
71	auto& obj = *reinterpret_cast<std::atomic<int64_t>*>(ptr);
72	obj.store(value, std::memory_order_release);
73}
74
75
76extern "C" [[gnu::optimize("omit-frame-pointer")]] int64_t
77atomic_get_and_set64(int64_t* ptr, int64_t value)
78{
79	auto& obj = *reinterpret_cast<std::atomic<int64_t>*>(ptr);
80	return obj.exchange(value);
81}
82
83
84extern "C" [[gnu::optimize("omit-frame-pointer")]] int64_t
85atomic_test_and_set64(int64_t* ptr, int64_t desired, int64_t expected)
86{
87	auto& obj = *reinterpret_cast<std::atomic<int64_t>*>(ptr);
88	obj.compare_exchange_strong(expected, desired);
89	return expected;
90}
91
92
93extern "C" [[gnu::optimize("omit-frame-pointer")]] int64_t
94atomic_add64(int64_t* ptr, int64_t value)
95{
96	auto& obj = *reinterpret_cast<std::atomic<int64_t>*>(ptr);
97	return obj.fetch_add(value);
98}
99
100
101extern "C" [[gnu::optimize("omit-frame-pointer")]] int64_t
102atomic_and64(int64_t* ptr, int64_t value)
103{
104	auto& obj = *reinterpret_cast<std::atomic<int64_t>*>(ptr);
105	return obj.fetch_and(value);
106}
107
108
109extern "C" [[gnu::optimize("omit-frame-pointer")]] int64_t
110atomic_or64(int64_t* ptr, int64_t value)
111{
112	auto& obj = *reinterpret_cast<std::atomic<int64_t>*>(ptr);
113	return obj.fetch_or(value);
114}
115
116
117extern "C" [[gnu::optimize("omit-frame-pointer")]] int64_t
118atomic_get64(int64_t* ptr)
119{
120	auto& obj = *reinterpret_cast<std::atomic<int64_t>*>(ptr);
121	return obj.load(std::memory_order_acquire);
122}
123
124