]> git.sesse.net Git - vlc/blobdiff - include/vlc_threads.h
vlc_threads: More barrier() support across toolchain and CPU.
[vlc] / include / vlc_threads.h
index a31f004eea9fb8fc9ce0b67c40e11cb8a5e7b8dc..2ce2302b7211a0b5ef38ef8a7955cc3de375606c 100644 (file)
@@ -567,10 +567,14 @@ static inline int vlc_spin_init (vlc_spinlock_t *spin)
 #endif
 static inline void barrier (void)
 {
-#if defined (__APPLE__)
-    OSMemoryBarrier();
-#elif defined (__GNUC__) /* FIXME: || defined (ICC_whatever) */
+#if defined (__GNUC__) && (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1)
     __sync_synchronize ();
+#elif defined(__APPLE__)
+    OSMemoryBarrier ();
+#elif defined(__powerpc__)
+    asm volatile ("sync":::"memory");
+#elif defined(__i386__)
+    asm volatile ("mfence":::"memory");
 #elif defined (LIBVLC_USE_PTHREAD)
     static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
     pthread_mutex_lock (&lock);