1/*
2 * Copyright 2019, Haiku, Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 *		Augustin Cavalier <waddlesplash>
7 */
8#ifndef __NVME_ATOMIC_H__
9#define __NVME_ATOMIC_H__
10
11#include <OS.h>
12
13
14/* 32-bit atomics */
15typedef int32 nvme_atomic_t;
16
17#define NVME_ATOMIC_INIT(val)	(val)
18
19static inline void
20nvme_atomic_init(nvme_atomic_t* v)
21{
22	*v = 0;
23}
24
25static inline void
26nvme_atomic_clear(nvme_atomic_t* v)
27{
28	*v = 0;
29}
30
31
32static inline int32
33nvme_atomic_read(const nvme_atomic_t* v)
34{
35	return atomic_get(v);
36}
37
38
39static inline void
40nvme_atomic_set(nvme_atomic_t* v, int32 new_value)
41{
42	atomic_set(v, new_value);
43}
44
45
46static inline void
47nvme_atomic_add(nvme_atomic_t* v, int32 inc)
48{
49	atomic_add(v, inc);
50}
51
52
53static inline void
54nvme_atomic_sub(nvme_atomic_t* v, int32 dec)
55{
56	atomic_add(v, -dec);
57}
58
59
60static inline void
61nvme_atomic_inc(nvme_atomic_t* v)
62{
63	nvme_atomic_add(v, 1);
64}
65
66
67static inline void
68nvme_atomic_dec(nvme_atomic_t* v)
69{
70	nvme_atomic_sub(v, 1);
71}
72
73
74static inline int32
75nvme_atomic_add_return(nvme_atomic_t* v, int32 inc)
76{
77	return atomic_add(v, inc);
78}
79
80
81static inline int32
82nvme_atomic_sub_return(nvme_atomic_t* v, int32 dec)
83{
84	return atomic_add(v, -dec);
85}
86
87
88static inline int
89nvme_atomic_inc_and_test(nvme_atomic_t *v)
90{
91	return nvme_atomic_add_return(v, 1) == 0;
92}
93
94
95static inline int
96nvme_atomic_dec_and_test(nvme_atomic64_t *v)
97{
98	return nvme_atomic_sub_return(v, 1) == 0;
99}
100
101
102static inline int
103nvme_atomic_test_and_set(nvme_atomic_t* v)
104{
105	return atomic_test_and_set(v, 1, 0);
106}
107
108
109/* 64-bit atomics */
110typedef int64 nvme_atomic64_t;
111
112#define NVME_ATOMIC64_INIT(val) (val)
113
114static inline void
115nvme_atomic64_init(nvme_atomic64_t *v)
116{
117	atomic_set64(v, 0);
118}
119
120static inline void
121nvme_atomic64_clear(nvme_atomic64_t *v)
122{
123	atomic_set64(v, 0);
124}
125
126
127static inline int64
128nvme_atomic64_read(nvme_atomic64_t *v)
129{
130	return atomic_get64(v);
131}
132
133
134static inline void
135nvme_atomic64_set(nvme_atomic64_t *v, int64_t new_value)
136{
137	atomic_set64(v, new_value);
138}
139
140
141static inline void
142nvme_atomic64_add(nvme_atomic64_t *v, int64_t inc)
143{
144	atomic_add64(v, inc);
145}
146
147
148static inline void
149nvme_atomic64_sub(nvme_atomic64_t *v, int64_t dec)
150{
151	nvme_atomic64_add(v, -dec);
152}
153
154
155static inline void
156nvme_atomic64_inc(nvme_atomic64_t *v)
157{
158	nvme_atomic64_add(v, 1);
159}
160
161
162static inline void
163nvme_atomic64_dec(nvme_atomic64_t *v)
164{
165	nvme_atomic64_add(v, -1);
166}
167
168
169static inline int64
170nvme_atomic64_add_return(nvme_atomic64_t *v, int64_t inc)
171{
172	return atomic_add64(v, inc);
173}
174
175
176static inline int64_t
177nvme_atomic64_sub_return(nvme_atomic64_t *v, int64_t dec)
178{
179	return nvme_atomic64_add_return(v, -dec);
180}
181
182
183static inline int
184nvme_atomic64_inc_and_test(nvme_atomic64_t *v)
185{
186	return nvme_atomic64_add_return(v, 1) == 0;
187}
188
189
190static inline int
191nvme_atomic64_dec_and_test(nvme_atomic64_t *v)
192{
193	return nvme_atomic64_sub_return(v, 1) == 0;
194}
195
196
197static inline int
198nvme_atomic64_test_and_set(nvme_atomic64_t *v)
199{
200	return atomic_test_and_set64(v, 1, 0);
201}
202
203
204#endif
205