#include "bson-atomic.h"
#ifdef __BSON_NEED_BARRIER
#include <pthread.h>
static
pthread_mutex_t gBarrier = PTHREAD_MUTEX_INITIALIZER;
void
bson_memory_barrier (
void
)
{
pthread_mutex_lock (&gBarrier);
pthread_mutex_unlock (&gBarrier);
}
#endif
#ifdef __BSON_NEED_ATOMIC_32
#warning "Using mutex to emulate 32-bit atomics."
#include <pthread.h>
static
pthread_mutex_t gSync32 = PTHREAD_MUTEX_INITIALIZER;
int32_t
bson_atomic_int_add (
volatile
int32_t *p,
int32_t n)
{
int
ret;
pthread_mutex_lock (&gSync32);
*p += n;
ret = *p;
pthread_mutex_unlock (&gSync32);
return
ret;
}
#endif
#ifdef __BSON_NEED_ATOMIC_64
#include <pthread.h>
static
pthread_mutex_t gSync64 = PTHREAD_MUTEX_INITIALIZER;
int64_t
bson_atomic_int64_add (
volatile
int64_t *p,
int64_t n)
{
int64_t ret;
pthread_mutex_lock (&gSync64);
*p += n;
ret = *p;
pthread_mutex_unlock (&gSync64);
return
ret;
}
#endif