]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
Fix #1608 - atomic: add workaround for missing intrinsic atomic ops.
authorAdam Sutton <dev@adamsutton.me.uk>
Sat, 9 Feb 2013 23:18:28 +0000 (23:18 +0000)
committerAdam Sutton <dev@adamsutton.me.uk>
Fri, 15 Feb 2013 10:24:41 +0000 (10:24 +0000)
configure
src/atomic.h
src/main.c
src/tvheadend.h

index 1b618cea1e565646230f4e223cd2ef02854b2e5c..3d3ec68fad7002d0b8fb49a9dc8c6e9214951f81 100755 (executable)
--- a/configure
+++ b/configure
@@ -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
 #
index f4b8c9916fec238b21ffb2ded8c7b2ef5e50b025..db68ca7e40ece92c8e449a0dfa483e4c49fa9950 100644 (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);
+#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
index a9a506513388285ebf3537811d1a035705ce98fd..60c4cc1c4f1691334097fe660574e5b142abd19f 100644 (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);
index 6b0f3ab5b14fbf222bbd640cf206ada6b5e5902c..d2f2b4e557be5ecaade35117e44d3905dbc5a773 100644 (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;