v/thirdparty/stdatomic/nix/atomic.h

55 lines
1.1 KiB
C

/*
Compability header for stdatomic.h that works for all compilers supported
by V. For TCC the atomic features missing are implemented using mutex locks
*/
#ifndef __cplusplus
// If C just use stdatomic.h
#ifndef __TINYC__
#include <stdatomic.h>
#endif
#else
// CPP wrapper for atomic operations that are compatible with C
#include "atomic_cpp.h"
#endif
#ifdef __TINYC__
#include <pthread.h>
typedef intptr_t atomic_llong;
typedef intptr_t atomic_ullong;
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
/*
Wrapper for TCC to use mutex locks since it lacks the atomic functions
*/
static inline intptr_t atomic_fetch_add_explicit(intptr_t *x, size_t offset, int mo)
{
pthread_mutex_lock(&lock);
intptr_t old_value = *x;
*x = *x + offset;
pthread_mutex_unlock(&lock);
return old_value;
}
/*
Wrapper for TCC to use mutex locks since it lacks the atomic functions
*/
static inline intptr_t atomic_fetch_sub_explicit(intptr_t *x, size_t offset, int mo)
{
pthread_mutex_lock(&lock);
intptr_t old_value = *x;
*x = *x - offset;
pthread_mutex_unlock(&lock);
return old_value;
}
#endif