Files
ncpfs/include/private/asm-generic/atomic.h
ncpfs archive import 82706139bf Import ncpfs 2.2.1
2026-04-28 20:39:59 +02:00

55 lines
1.1 KiB
C

#ifndef __PRIVATE_LIBNCP_GENERIC_ATOMIC_H__
#define __PRIVATE_LIBNCP_GENERIC_ATOMIC_H__
#include "config.h"
#include "private/libncp-lock.h"
typedef struct {
int counter;
ncpt_mutex_t mutex;
} ncpt_atomic_t;
#define NCPT_ATOMIC_INIT(i) { (i), NCPT_MUTEX_INITIALIZER }
static inline int ncpt_atomic_read(ncpt_atomic_t* v) {
int tmp;
ncpt_mutex_lock(&v->mutex);
tmp = v->counter;
ncpt_mutex_unlock(&v->mutex);
return tmp;
}
static inline int ncpt_atomic_set(ncpt_atomic_t* v, int i) {
v->counter = i;
ncpt_mutex_init(&v->mutex);
return i;
}
static inline void ncpt_atomic_add(int i, ncpt_atomic_t* v) {
ncpt_mutex_lock(&v->mutex);
v->counter += i;
ncpt_mutex_unlock(&v->mutex);
}
static inline void ncpt_atomic_sub(int i, ncpt_atomic_t* v) {
ncpt_mutex_lock(&v->mutex);
v->counter -= i;
ncpt_mutex_unlock(&v->mutex);
}
#define ncpt_atomic_inc(v) ncpt_atomic_add(1,v)
#define ncpt_atomic_dec(v) ncpt_atomic_sub(1,v)
static inline int ncpt_atomic_dec_and_test(ncpt_atomic_t* v) {
int tmp;
ncpt_mutex_lock(&v->mutex);
tmp = !(--v->counter);
ncpt_mutex_unlock(&v->mutex);
return tmp;
}
#endif /* __PRIVATE_LIBNCP_GENERIC_ATOMIC_H__ */