kernel: add atomic operations

This commit is contained in:
2026-03-24 19:09:36 +00:00
parent 89d02c72ee
commit 9faa11cddc

66
include/kernel/atomic.h Normal file
View File

@@ -0,0 +1,66 @@
#ifndef KERNEL_ATOMIC_H_
#define KERNEL_ATOMIC_H_
#include <stdbool.h>
#include <stdint.h>
typedef int64_t atomic_t;
/* load and return the value pointed to by `v` */
static inline atomic_t atomic_load(atomic_t *v)
{
return __atomic_load_n(v, __ATOMIC_ACQUIRE);
}
/* store the value `v` to the pointer `dest` */
static inline void atomic_store(atomic_t *dest, atomic_t v)
{
__atomic_store_n(dest, v, __ATOMIC_ACQUIRE);
}
/* store the value `v` to the pointer `dest`, and return the value previously
* stored at `dest` */
static inline atomic_t atomic_exchange(atomic_t *dest, atomic_t v)
{
return __atomic_exchange_n(dest, v, __ATOMIC_ACQUIRE);
}
/* compare the contents of `ptr` to the contents of `expected`.
* if they match, store the value `desired` to the pointer `ptr` and return
* true. if the do NOT match, store the value `*ptr` to the pointer `desired`
* and return false.
*/
static inline bool atomic_compare_exchange(
atomic_t *ptr,
atomic_t *expected,
atomic_t desired)
{
return __atomic_compare_exchange_n(
ptr,
expected,
desired,
false,
__ATOMIC_ACQUIRE,
__ATOMIC_ACQUIRE);
}
/* perform the operation *ptr += val, and return the result */
static inline atomic_t atomic_add_fetch(atomic_t *ptr, atomic_t val)
{
return __atomic_add_fetch(ptr, val, __ATOMIC_ACQUIRE);
}
/* perform the operation *ptr -= val, and return the result */
static inline atomic_t atomic_sub_fetch(atomic_t *ptr, atomic_t val)
{
return __atomic_sub_fetch(ptr, val, __ATOMIC_ACQUIRE);
}
/* perform the operation *ptr += val, and return the previous value of *ptr */
static inline atomic_t atomic_fetch_add(atomic_t *ptr, atomic_t val)
{
return __atomic_fetch_add(ptr, val, __ATOMIC_ACQUIRE);
}
/* perform the operation *ptr -= val, and return the previous value of *ptr */
static inline atomic_t atomic_fetch_sub(atomic_t *ptr, atomic_t val)
{
return __atomic_fetch_sub(ptr, val, __ATOMIC_ACQUIRE);
}
#endif