File FIXME.diff of Package libqt4

Index: src/corelib/arch/qatomic_arch.h
===================================================================
--- src/corelib/arch/qatomic_arch.h	(revision 652925)
+++ src/corelib/arch/qatomic_arch.h	(working copy)
@@ -28,7 +28,80 @@
 
 QT_BEGIN_HEADER
 
-#if defined(QT_ARCH_ALPHA)
+#if !defined(QT_ARCH_I386)
+#define QT_NATIVE_ATOMIC_BUILTINS 1
+#endif
+
+#ifdef QT_NATIVE_ATOMIC_BUILTINS
+
+inline int q_atomic_test_and_set_int(volatile int *ptr, int expected, int newval)
+{
+    return __sync_bool_compare_and_swap(ptr, expected, newval);
+}
+
+inline int q_atomic_test_and_set_acquire_int(volatile int *ptr, int expected, int newval)
+{
+    // there is __sync_lock_test_and_set, but it only allows mutex·
+    // semantics (writing 1 and 0). Qt API wants more.
+    return q_atomic_test_and_set_int(ptr, expected, newval);
+}
+
+inline int q_atomic_test_and_set_release_int(volatile int *ptr, int expected, int newval)
+{
+    // there is __sync_lock_test_and_set, but it only allows mutex·
+    // semantics (writing 1 and 0). Qt API wants more.
+    return q_atomic_test_and_set_int(ptr, expected, newval);
+}
+
+inline int q_atomic_test_and_set_ptr(volatile void *ptr, void *expected, void *newval)
+{
+    return __sync_bool_compare_and_swap(reinterpret_cast<void * volatile *>(ptr),
+                                        expected, newval);
+}
+
+inline int q_atomic_increment(volatile int *ptr)
+{
+    return __sync_add_and_fetch(ptr, 1);
+}
+
+inline int q_atomic_decrement(volatile int *ptr)
+{
+    return __sync_add_and_fetch(ptr, -1);
+}
+
+inline int q_atomic_set_int(volatile int *ptr, int newval)
+{
+    register int ret = *ptr;
+    while (! q_atomic_test_and_set_int(ptr, ret, newval))
+        ret = *ptr;
+    return ret;
+}
+
+inline void *q_atomic_set_ptr(volatile void *_ptr, void *newval)
+{
+    void * volatile * ptr = reinterpret_cast<void * volatile *>(_ptr);
+    void * volatile ret = *ptr;
+    while (! q_atomic_test_and_set_ptr(ptr, ret, newval))
+        ret = *ptr;
+    return ret;
+}
+
+inline int q_atomic_fetch_and_add_int(volatile int *ptr, int value)
+{
+    return __sync_fetch_and_add(ptr, value);
+}
+
+inline int q_atomic_fetch_and_add_acquire_int(volatile int *ptr, int value)
+{
+    return __sync_fetch_and_add(ptr, value);
+}
+
+inline int q_atomic_fetch_and_add_release_int(volatile int *ptr, int value)
+{
+    return __sync_fetch_and_add(ptr, value);
+}
+
+#elif defined(QT_ARCH_ALPHA)
 #  include "QtCore/qatomic_alpha.h"
 #elif defined(QT_ARCH_ARM)
 #  include "QtCore/qatomic_arm.h"
Index: src/corelib/arch/qatomic_s390.h
===================================================================
--- src/corelib/arch/qatomic_s390.h	(revision 652925)
+++ src/corelib/arch/qatomic_s390.h	(working copy)
@@ -182,10 +182,20 @@ inline void *q_atomic_set_ptr(volatile v
 #endif
 }
 
-#error "fetch-and-add not implemented"
-// int q_atomic_fetch_and_add_int(volatile int *ptr, int value);
-// int q_atomic_fetch_and_add_acquire_int(volatile int *ptr, int value);
-// int q_atomic_fetch_and_add_release_int(volatile int *ptr, int value);
+inline int q_atomic_fetch_and_add_int(volatile int *ptr, int value)
+{
+    return __sync_fetch_and_add(ptr, value);
+}
+
+inline int q_atomic_fetch_and_add_acquire_int(volatile int *ptr, int value)
+{
+    return __sync_fetch_and_add(ptr, value);
+}
+
+inline int q_atomic_fetch_and_add_release_int(volatile int *ptr, int value)
+{
+    return __sync_fetch_and_add(ptr, value);
+}
 
 QT_END_HEADER
 
openSUSE Build Service is sponsored by