]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
atomic.h: add mutex implementation for 64-bit exchange, fixes #3616
authorJaroslav Kysela <perex@perex.cz>
Wed, 9 Mar 2016 13:51:26 +0000 (14:51 +0100)
committerJaroslav Kysela <perex@perex.cz>
Wed, 9 Mar 2016 13:51:26 +0000 (14:51 +0100)
src/atomic.h

index 125d785e86b74a30b781f3f94930e421714aa6e3..a4efb83f01f4beaf746eb4f0ccdffd6c55e304fe 100644 (file)
@@ -150,19 +150,43 @@ atomic_exchange(volatile int *ptr, int val)
 static inline uint64_t
 atomic_exchange_u64(volatile uint64_t *ptr, uint64_t val)
 {
+#if ENABLE_ATOMIC64
   return  __sync_lock_test_and_set(ptr, val);
+#else
+  uint64_t ret;
+  pthread_mutex_lock(&atomic_lock);
+  ret = *ptr;
+  *ptr = val;
+  pthread_mutex_unlock(&atomic_lock);
+#endif
 }
 
 static inline int64_t
 atomic_exchange_s64(volatile int64_t *ptr, int64_t val)
 {
+#if ENABLE_ATOMIC64
   return  __sync_lock_test_and_set(ptr, val);
+#else
+  int64_t ret;
+  pthread_mutex_lock(&atomic_lock);
+  ret = *ptr;
+  *ptr = val;
+  pthread_mutex_unlock(&atomic_lock);
+#endif
 }
 
 static inline time_t
 atomic_exchange_time_t(volatile time_t *ptr, time_t val)
 {
+#if ENABLE_ATOMIC_TIME_T
   return  __sync_lock_test_and_set(ptr, val);
+#else
+  time_t ret;
+  pthread_mutex_lock(&atomic_lock);
+  ret = *ptr;
+  *ptr = val;
+  pthread_mutex_unlock(&atomic_lock);
+#endif
 }
 
 /*