55 lines
1.1 KiB
C
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
|