diff options
author | Ryo Nakamura <upa@haeena.net> | 2022-10-20 20:25:23 +0900 |
---|---|---|
committer | Ryo Nakamura <upa@haeena.net> | 2022-10-20 20:25:23 +0900 |
commit | ab0bf7e5dc5f11ef8b108d0b5d65a6013e7fb2f4 (patch) | |
tree | 7921868d4665a07552a13debf251c1e139d4bbe8 /src/atomic.h | |
parent | 808069ab9dc57dbebcf46d0ff95114581cb5315c (diff) |
add atomic refcnt and locks.
It might be unnecessary, if open/close can be done without lock.
Diffstat (limited to 'src/atomic.h')
-rw-r--r-- | src/atomic.h | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/src/atomic.h b/src/atomic.h new file mode 100644 index 0000000..a840653 --- /dev/null +++ b/src/atomic.h @@ -0,0 +1,58 @@ +#ifndef _ATOMIC_H_ +#define _ATOMIC_H_ + +#include <stdlib.h> +#include <pthread.h> +#include <util.h> + +typedef int refcnt; + +static inline void refcnt_inc(refcnt *cnt) +{ + __sync_add_and_fetch(cnt, 1); +} + +static inline void refcnt_dec(refcnt *cnt) +{ + __sync_sub_and_fetch(cnt, 1); +} + + +typedef pthread_mutex_t lock; + +static inline void lock_init(lock *l) +{ + pthread_mutex_init(l, NULL); +} + +static inline void lock_acquire(lock *l) +{ + int ret = pthread_mutex_lock(l); + if (ret < 0) { + switch (ret) { + case EINVAL: + pr_err("invalid mutex\n"); + exit(1); + case EDEADLK: + pr_err("a deadlock would occur\n"); + exit(1); + } + } +} + +static inline void lock_release(lock *l) +{ + int ret = pthread_mutex_unlock(l); + if (ret < 0) { + switch (ret) { + case EINVAL: + pr_err("invalid mutex\n"); + exit(1); + case EPERM: + pr_err("this thread does not hold this mutex\n"); + exit(1); + } + } +} + +#endif /* _ATOMIC_H_ */ |