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