Fix #1608 - atomic: add workaround for missing intrinsic atomic ops.
This commit is contained in:
parent
b043cf3729
commit
8f49909e9e
4 changed files with 32 additions and 6 deletions
5
configure
vendored
5
configure
vendored
|
@ -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
|
||||
#
|
||||
|
|
30
src/atomic.h
30
src/atomic.h
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue