Fix #1608 - atomic: add workaround for missing intrinsic atomic ops.

This commit is contained in:
Adam Sutton 2013-02-09 23:18:28 +00:00
parent b043cf3729
commit 8f49909e9e
4 changed files with 32 additions and 6 deletions

5
configure vendored
View file

@ -54,6 +54,11 @@ check_cc_option sse2
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
#

View file

@ -33,13 +33,31 @@ atomic_exchange(volatile int *ptr, int new)
static inline uint64_t
atomic_add_u64(volatile uint64_t *ptr, uint64_t incr)
{
#if ENABLE_ATOMIC64
return __sync_fetch_and_add(ptr, incr);
}
static inline uint64_t
atomic_pre_add_u64(volatile uint64_t *ptr, uint64_t incr)
{
return __sync_add_and_fetch(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

View file

@ -139,6 +139,7 @@ time_t dispatch_clock;
pthread_mutex_t global_lock;
pthread_mutex_t ffmpeg_lock;
pthread_mutex_t fork_lock;
pthread_mutex_t atomic_lock;
/*
* Locals
@ -574,6 +575,7 @@ main(int argc, char **argv)
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);

View file

@ -63,6 +63,7 @@ static inline htsmsg_t *tvheadend_capabilities_list(int check)
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;