VSF Documented
atomic.h
Go to the documentation of this file.
1#ifndef __VSF_LINUX_ATOMIC_H__
2#define __VSF_LINUX_ATOMIC_H__
3
4// for uintalu_t
5#include "hal/arch/vsf_arch.h"
6
7#ifdef __cplusplus
8extern "C" {
9#endif
10
11#if defined(__VSF64__)
12# define __VSF_LINUX_ATOM_BITLEN__ 64
13#elif defined(__VSF16__)
14# define __VSF_LINUX_ATOM_BITLEN__ 16
15#elif defined(__VSF8__)
16# define __VSF_LINUX_ATOM_BITLEN__ 8
17#elif defined(__VSF32__)
18# define __VSF_LINUX_ATOM_BITLEN__ 32
19#else
20# define __VSF_LINUX_ATOM_BITLEN__ 32
21#endif
22
23typedef struct {
24 volatile intalu_t counter;
25} atomic_t;
26#define ATOMIC_INIT(__VALUE) { (__VALUE) }
27
28#define atomic_set(__v, __i) ((__v)->counter = (__i))
29#define atomic_read(__v) ((__v)->counter)
30
31#define atomic_add(__i, __v) vsf_atom_add(__VSF_LINUX_ATOM_BITLEN__, &(__v)->counter, (__i))
32#define atomic_sub(__i, __v) atomic_add(- (__i), (__v))
33#define atomic_inc(__v) atomic_add(1, __v)
34#define atomic_dec(__v) atomic_sub(1, __v)
35
36#define atomic_add_return(__i, __v) ({ \
37 int VSF_MACRO_SAFE_NAME(value) = (__i); \
38 vsf_atom_add(__VSF_LINUX_ATOM_BITLEN__, &(__v)->counter, VSF_MACRO_SAFE_NAME(value)) + VSF_MACRO_SAFE_NAME(value);\
39})
40#define atomic_sub_return(__i, __v) atomic_add_return(- (__i), (__v))
41#define atomic_inc_return(__v) atomic_add_return(1, (__v))
42#define atomic_dec_return(__v) atomic_sub_return(1, (__v))
43
44#define atomic_inc_and_test(__v) (!atomic_inc_return(__v))
45#define atomic_dec_and_test(__v) (!atomic_dec_return(__v))
46#define atomic_sub_and_test(__i, __v) (!atomic_sub_return((__i), (__v)))
47
48#define atomic_add_negative(__i, __v) (atomic_sub_return((__i), (__v)) < 0)
49
50#define atomic_xchg(__v, __new) vsf_atom_xchg(__VSF_LINUX_ATOM_BITLEN__, &(__v)->counter, (__new))
51
52#ifdef __cplusplus
53}
54#endif
55
56#endif
int_fast8_t intalu_t
Definition type.h:89
Definition atomic.h:23
volatile intalu_t counter
Definition atomic.h:24