check_cc_snippet getloadavg '#include <stdlib.h>
void test() { getloadavg(NULL,0); }'
+check_cc_snippet atomic64 '#include <stdint.h>
+uint64_t test(uint64_t *ptr){
+return __sync_fetch_and_add(ptr, 1);
+}'
+
#
# Python
#
static inline uint64_t
atomic_add_u64(volatile uint64_t *ptr, uint64_t incr)
{
+#if ENABLE_ATOMIC64
return __sync_fetch_and_add(ptr, incr);
+#else
+ uint64_t ret;
+ pthread_mutex_lock(&atomic_lock);
+ ret = *ptr;
+ *ptr += incr;
+ pthread_mutex_unlock(&atomic_lock);
+ return ret;
+#endif
}
static inline uint64_t
atomic_pre_add_u64(volatile uint64_t *ptr, uint64_t incr)
{
+#if ENABLE_ATOMIC64
return __sync_add_and_fetch(ptr, incr);
+#else
+ uint64_t ret;
+ pthread_mutex_lock(&atomic_lock);
+ *ptr += incr;
+ ret = *ptr;
+ pthread_mutex_unlock(&atomic_lock);
+ return ret;
+#endif
}
static inline uint64_t
pthread_mutex_t global_lock;
pthread_mutex_t ffmpeg_lock;
pthread_mutex_t fork_lock;
+pthread_mutex_t atomic_lock;
/*
* Locals
pthread_mutex_init(&ffmpeg_lock, NULL);
pthread_mutex_init(&fork_lock, NULL);
pthread_mutex_init(&global_lock, NULL);
+ pthread_mutex_init(&atomic_lock, NULL);
pthread_mutex_lock(&global_lock);
time(&dispatch_clock);
extern pthread_mutex_t global_lock;
extern pthread_mutex_t ffmpeg_lock;
extern pthread_mutex_t fork_lock;
+extern pthread_mutex_t atomic_lock;
extern int tvheadend_webui_port;
extern int tvheadend_webui_debug;