18 lines
480 B
C
18 lines
480 B
C
#include <zinnia/refcount.h>
|
|
#include <stdatomic.h>
|
|
|
|
void refcount_init(struct refcount* rc) {
|
|
atomic_store_explicit(&rc->count, 1, memory_order_relaxed);
|
|
}
|
|
|
|
void refcount_inc(struct refcount* rc) {
|
|
atomic_fetch_add_explicit(&rc->count, 1, memory_order_relaxed);
|
|
}
|
|
|
|
bool refcount_dec(struct refcount* rc) {
|
|
if (atomic_fetch_sub_explicit(&rc->count, 1, memory_order_release) != 1)
|
|
return false;
|
|
atomic_thread_fence(memory_order_acquire);
|
|
return true;
|
|
}
|