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