check_cc_snippet getloadavg '#include <stdlib.h>
void test() { getloadavg(NULL,0); }'
+check_cc_snippet atomic32 '#include <stdint.h>
+int test(int *ptr){
+return __sync_fetch_and_add(ptr, 1);
+}'
+
check_cc_snippet atomic64 '#include <stdint.h>
uint64_t test(uint64_t *ptr){
return __sync_fetch_and_add(ptr, 1);
static inline int
atomic_add(volatile int *ptr, int incr)
{
+#if ENABLE_ATOMIC32
return __sync_fetch_and_add(ptr, incr);
+#else
+ int ret;
+ pthread_mutex_lock(&atomic_lock);
+ ret = *ptr;
+ *ptr += incr;
+ pthread_mutex_unlock(&atomic_lock);
+ return ret;
+#endif
}
static inline uint64_t
static inline int
atomic_dec(volatile int *ptr, int decr)
{
+#if ENABLE_ATOMIC32
return __sync_fetch_and_sub(ptr, decr);
+#else
+ int ret;
+ pthread_mutex_lock(&atomic_lock);
+ ret = *ptr;
+ *ptr -= decr;
+ pthread_mutex_unlock(&atomic_lock);
+ return ret;
+#endif
}
static inline uint64_t
static inline int
atomic_exchange(volatile int *ptr, int val)
{
+#if ENABLE_ATOMIC32
return __sync_lock_test_and_set(ptr, val);
+#else
+ int ret;
+ pthread_mutex_lock(&atomic_lock);
+ ret = *ptr;
+ *ptr = val;
+ pthread_mutex_unlock(&atomic_lock);
+ return ret;
+#endif
}
static inline uint64_t