Fix atomic operations on ARM

This commit is contained in:
Vitezslav Crhonek 2013-05-07 12:30:00 +02:00
parent 6fb76860d5
commit 71a9ad6a8c
2 changed files with 89 additions and 1 deletions

View File

@ -0,0 +1,81 @@
Index: src/Pegasus/Common/AtomicInt.h
===================================================================
RCS file: /cvs/MSB/pegasus/src/Pegasus/Common/AtomicInt.h,v
retrieving revision 1.23
diff -u -r1.23 AtomicInt.h
--- src/Pegasus/Common/AtomicInt.h 30 Jul 2012 09:23:47 -0000 1.23
+++ src/Pegasus/Common/AtomicInt.h 30 Apr 2013 14:04:53 -0000
@@ -95,6 +95,64 @@
PEGASUS_NAMESPACE_END
+// if GNU GCC version >= 4.7.0, use the built-in atomic operations
+#if defined(GCC_VERSION) && GCC_VERSION >= 40700
+# define PEGASUS_ATOMIC_INT_DEFINED
+
+PEGASUS_NAMESPACE_BEGIN
+
+struct AtomicType
+{
+ volatile int n;
+};
+
+PEGASUS_TEMPLATE_SPECIALIZATION
+inline AtomicIntTemplate<AtomicType>::AtomicIntTemplate(Uint32 n)
+{
+ __atomic_store_n (&_rep.n, n, __ATOMIC_SEQ_CST);
+}
+
+PEGASUS_TEMPLATE_SPECIALIZATION
+inline AtomicIntTemplate<AtomicType>::~AtomicIntTemplate()
+{
+}
+
+PEGASUS_TEMPLATE_SPECIALIZATION
+inline Uint32 AtomicIntTemplate<AtomicType>::get() const
+{
+ return __atomic_load_n (&_rep.n, __ATOMIC_SEQ_CST);
+}
+
+PEGASUS_TEMPLATE_SPECIALIZATION
+inline void AtomicIntTemplate<AtomicType>::set(Uint32 n)
+{
+ __atomic_store_n (&_rep.n, n, __ATOMIC_SEQ_CST);
+}
+
+PEGASUS_TEMPLATE_SPECIALIZATION
+inline void AtomicIntTemplate<AtomicType>::inc()
+{
+ __atomic_fetch_add (&_rep.n, 1, __ATOMIC_SEQ_CST);
+}
+
+PEGASUS_TEMPLATE_SPECIALIZATION
+inline void AtomicIntTemplate<AtomicType>::dec()
+{
+ __atomic_fetch_sub (&_rep.n, 1, __ATOMIC_SEQ_CST);
+}
+
+PEGASUS_TEMPLATE_SPECIALIZATION
+inline bool AtomicIntTemplate<AtomicType>::decAndTestIfZero()
+{
+ return (__atomic_fetch_sub (&_rep.n, 1, __ATOMIC_SEQ_CST) == 1);
+}
+
+typedef AtomicIntTemplate<AtomicType> AtomicInt;
+
+PEGASUS_NAMESPACE_END
+
+#else //!(GCC_VERSION && GCC_VERSION >= 40700), use platform specific atomics
+
//==============================================================================
//
// PEGASUS_PLATFORM_LINUX_IX86_GNU
@@ -1056,6 +1114,8 @@
#endif /* PEGASUS_PLATFORM_AIX_RS_IBMCXX, \
PEGASUS_PLATFORM_PASE_ISERIES_IBMCXX */
+#endif /* GCC_VERSION && GCC_VERSION >= 40700 */
+
//==============================================================================
//
// Generic Implementation

View File

@ -8,7 +8,7 @@
Name: tog-pegasus
Version: %{major_ver}.1
Release: 2%{?dist}
Release: 3%{?dist}
Epoch: 2
Summary: OpenPegasus WBEM Services for Linux
@ -78,6 +78,8 @@ Patch24: pegasus-2.12.0-empty_arrays.patch
Patch25: pegasus-2.12.0-cimmofl-allow-experimental.patch
# 26: use external schema and add missing includes there
Patch26: pegasus-2.12.0-schema-version-and-includes.patch
# 27: patch by D. Marlin, already upstream
Patch27: pegasus-2.12.1-atomic-operations-on-arm.patch
BuildRequires: bash, sed, grep, coreutils, procps, gcc, gcc-c++
BuildRequires: libstdc++, make, pam-devel
@ -209,6 +211,7 @@ yes | mak/CreateDmtfSchema 233 %{SOURCE9} cim_schema_2.33.0
%patch24 -p1 -b .empty_arrays
%patch25 -p1 -b .cimmofl-allow-experimental
%patch26 -p1 -b .schema-version-and-includes
%patch27 -p0 -b .atomic-operations-on-arm
%build
@ -475,6 +478,10 @@ fi
%changelog
* Tue May 07 2013 Vitezslav Crhonek <vcrhonek@redhat.com> - 2:2.12.1-3
- Fix atomic operations on ARM (patch by D. Marlin)
Resolves: #922770
* Thu Apr 25 2013 Vitezslav Crhonek <vcrhonek@redhat.com> - 2:2.12.1-2
- Add -fno-strict-aliasing