Sophie

Sophie

distrib > Fedora > 16 > x86_64 > media > updates-src > by-pkgid > 6956a956ce94750fb813a81206fe6194 > files > 4

directfb-1.5.3-9.fc16.src.rpm

--- DirectFB-1.5.3_orig/lib/direct/atomic.h	2011-07-31 14:51:06.000000000 -0400
+++ DirectFB-1.5.3/lib/direct/atomic.h	2012-05-09 01:24:02.692169840 -0400
@@ -185,20 +185,13 @@
 
 #if defined(ARCH_ARM) && !defined(ARCH_IWMMXT)
 
-static inline int _D__atomic_cmpxchg(volatile int *ptr, int old, int new)
+static inline int _D__atomic_cmpxchg(volatile int *ptr, int old, int _new)
 {
-	unsigned long oldval, res;
 
-	do {
-		__asm__ __volatile__("@ atomic_cmpxchg\n"
-		"ldrex	%1, [%2]\n"
-		"mov	%0, #0\n"
-		"teq	%1, %3\n"
-		"strexeq %0, %4, [%2]\n"
-		    : "=&r" (res), "=&r" (oldval)
-		    : "r" (ptr), "Ir" (old), "r" (new)
-		    : "cc");
-	} while (res);
+	unsigned long oldval = old;
+
+	__atomic_compare_exchange_n(ptr, &oldval, _new,
+				    false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
 
 	return oldval;
 }
@@ -220,24 +213,14 @@ static inline int _D__atomic_cmpxchg(vol
 
 static inline int _D__atomic_add_return(int i, volatile int *v)
 {
-	unsigned long tmp;
-	int result;
 
-	__asm__ __volatile__("@ atomic_add_return\n"
-"1:	ldrex	%0, [%2]\n"
-"	add	%0, %0, %3\n"
-"	strex	%1, %0, [%2]\n"
-"	teq	%1, #0\n"
-"	bne	1b"
-	: "=&r" (result), "=&r" (tmp)
-	: "r" (v), "Ir" (i)
-	: "cc");
+	int result = __atomic_add_fetch(v, i, __ATOMIC_SEQ_CST);
 
 	return result;
 }
 
 #define D_SYNC_ADD_AND_FETCH( ptr, value )                                           \
-     (_D__atomic_add_return( (int) (value), (void*) (ptr) ))
+     (_D__atomic_add_return( (int) (value), (volatile int*) (ptr) ))
 
 #endif
 
@@ -308,7 +291,7 @@ static inline int _D__atomic_add_return(
 }
 
 #define D_SYNC_ADD_AND_FETCH( ptr, value )                                           \
-     (_D__atomic_add_return( (int) (value), (void*) (ptr) ))
+     (_D__atomic_add_return( (int) (value), (volatile int*) (ptr) ))
 
 #endif