[sems] Fix building w/o built-in atomic gcc functions

Peter Lemenkov peter at fedoraproject.org
Wed Sep 29 09:45:26 UTC 2010


commit a72b3dc2dc5ffd0379c3ed1d5f3f8f58ae5372ec
Author: Peter Lemenkov <lemenkov at gmail.com>
Date:   Wed Sep 29 13:45:20 2010 +0400

    Fix building w/o built-in atomic gcc functions
    
    Signed-off-by: Peter Lemenkov <lemenkov at gmail.com>

 ...001-Force-to-use-system-wide-GSM-includes.patch |    2 +-
 ...llow-rewrite-of-custom-makefiles-by-CMake.patch |    2 +-
 ...Set-CFG_PREFIX-to-empty-string-by-default.patch |    2 +-
 ...ql-in-conference-and-early_announce-modul.patch |    2 +-
 ...aid_sip-plugin-to-default-exclude-list-du.patch |    2 +-
 sems-0006-More-cmake-templates.patch               |    2 +-
 sems-0007-Enable-py_sems-building-with-CMake.patch |    2 +-
 sems-0008-Enable-sst_b2b-building-with-sems.patch  |    2 +-
 ...chitectures-w-o-atomic-built-in-functions.patch |  179 ++++++++++++++++++++
 sems.spec                                          |   10 +-
 10 files changed, 196 insertions(+), 9 deletions(-)
---
diff --git a/sems-0001-Force-to-use-system-wide-GSM-includes.patch b/sems-0001-Force-to-use-system-wide-GSM-includes.patch
index df3fae0..121c702 100644
--- a/sems-0001-Force-to-use-system-wide-GSM-includes.patch
+++ b/sems-0001-Force-to-use-system-wide-GSM-includes.patch
@@ -1,7 +1,7 @@
 From f40d07c03612e51bbd0d3330535d8ebc365b506c Mon Sep 17 00:00:00 2001
 From: Peter Lemenkov <lemenkov at gmail.com>
 Date: Wed, 31 Mar 2010 11:52:52 +0400
-Subject: [PATCH 1/8] Force to use system-wide GSM includes
+Subject: [PATCH 1/9] Force to use system-wide GSM includes
 
 Signed-off-by: Peter Lemenkov <lemenkov at gmail.com>
 ---
diff --git a/sems-0002-Allow-rewrite-of-custom-makefiles-by-CMake.patch b/sems-0002-Allow-rewrite-of-custom-makefiles-by-CMake.patch
index 7da8a9e..11074ac 100644
--- a/sems-0002-Allow-rewrite-of-custom-makefiles-by-CMake.patch
+++ b/sems-0002-Allow-rewrite-of-custom-makefiles-by-CMake.patch
@@ -1,7 +1,7 @@
 From c53a56b9667ea821281e14ed763d4db49e256c71 Mon Sep 17 00:00:00 2001
 From: Peter Lemenkov <lemenkov at gmail.com>
 Date: Wed, 31 Mar 2010 11:53:48 +0400
-Subject: [PATCH 2/8] Allow rewrite of custom makefiles by CMake
+Subject: [PATCH 2/9] Allow rewrite of custom makefiles by CMake
 
 Signed-off-by: Peter Lemenkov <lemenkov at gmail.com>
 ---
diff --git a/sems-0003-Set-CFG_PREFIX-to-empty-string-by-default.patch b/sems-0003-Set-CFG_PREFIX-to-empty-string-by-default.patch
index 6da11a1..2246d42 100644
--- a/sems-0003-Set-CFG_PREFIX-to-empty-string-by-default.patch
+++ b/sems-0003-Set-CFG_PREFIX-to-empty-string-by-default.patch
@@ -1,7 +1,7 @@
 From f240f4b7cf5701ce93b812e4be77428d9514fb28 Mon Sep 17 00:00:00 2001
 From: Peter Lemenkov <lemenkov at gmail.com>
 Date: Wed, 31 Mar 2010 18:56:39 +0400
-Subject: [PATCH 3/8] Set CFG_PREFIX to empty string by default
+Subject: [PATCH 3/9] Set CFG_PREFIX to empty string by default
 
 Signed-off-by: Peter Lemenkov <lemenkov at gmail.com>
 ---
diff --git a/sems-0004-Disable-mysql-in-conference-and-early_announce-modul.patch b/sems-0004-Disable-mysql-in-conference-and-early_announce-modul.patch
index 01027c0..9b02fac 100644
--- a/sems-0004-Disable-mysql-in-conference-and-early_announce-modul.patch
+++ b/sems-0004-Disable-mysql-in-conference-and-early_announce-modul.patch
@@ -1,7 +1,7 @@
 From 460b5e654e5789b75a3514d1de9b658f0245a62e Mon Sep 17 00:00:00 2001
 From: Peter Lemenkov <lemenkov at gmail.com>
 Date: Fri, 25 Jun 2010 12:16:45 +0400
-Subject: [PATCH 4/8] Disable mysql++ in conference and early_announce modules
+Subject: [PATCH 4/9] Disable mysql++ in conference and early_announce modules
 
 Unfortunately, this breaks existing configurations, which is a
 no-go situation for EPEL repository. We'll enable it later.
diff --git a/sems-0005-Add-sw_prepaid_sip-plugin-to-default-exclude-list-du.patch b/sems-0005-Add-sw_prepaid_sip-plugin-to-default-exclude-list-du.patch
index 5bb333d..ca22757 100644
--- a/sems-0005-Add-sw_prepaid_sip-plugin-to-default-exclude-list-du.patch
+++ b/sems-0005-Add-sw_prepaid_sip-plugin-to-default-exclude-list-du.patch
@@ -1,7 +1,7 @@
 From 18a743c479753fca2dd561cebea0317ce3de6871 Mon Sep 17 00:00:00 2001
 From: Peter Lemenkov <lemenkov at gmail.com>
 Date: Mon, 27 Sep 2010 14:13:00 +0400
-Subject: [PATCH 5/8] Add sw_prepaid_sip plugin to default exclude list (due to missing cc_acc)
+Subject: [PATCH 5/9] Add sw_prepaid_sip plugin to default exclude list (due to missing cc_acc)
 
 Signed-off-by: Peter Lemenkov <lemenkov at gmail.com>
 ---
diff --git a/sems-0006-More-cmake-templates.patch b/sems-0006-More-cmake-templates.patch
index 4046250..36250ed 100644
--- a/sems-0006-More-cmake-templates.patch
+++ b/sems-0006-More-cmake-templates.patch
@@ -1,7 +1,7 @@
 From 67543e5578c9ef136444afa32acf625a744ad1fb Mon Sep 17 00:00:00 2001
 From: Peter Lemenkov <lemenkov at gmail.com>
 Date: Mon, 27 Sep 2010 15:38:10 +0400
-Subject: [PATCH 6/8] More cmake templates
+Subject: [PATCH 6/9] More cmake templates
 
 Signed-off-by: Peter Lemenkov <lemenkov at gmail.com>
 ---
diff --git a/sems-0007-Enable-py_sems-building-with-CMake.patch b/sems-0007-Enable-py_sems-building-with-CMake.patch
index ffb901a..1f5323f 100644
--- a/sems-0007-Enable-py_sems-building-with-CMake.patch
+++ b/sems-0007-Enable-py_sems-building-with-CMake.patch
@@ -1,7 +1,7 @@
 From d85e44d59f5d4cfc250d4298f33eefc5338cedf9 Mon Sep 17 00:00:00 2001
 From: Peter Lemenkov <lemenkov at gmail.com>
 Date: Mon, 27 Sep 2010 16:41:18 +0400
-Subject: [PATCH 7/8] Enable py_sems building with CMake
+Subject: [PATCH 7/9] Enable py_sems building with CMake
 
 Signed-off-by: Peter Lemenkov <lemenkov at gmail.com>
 ---
diff --git a/sems-0008-Enable-sst_b2b-building-with-sems.patch b/sems-0008-Enable-sst_b2b-building-with-sems.patch
index c6d42c8..e8e4c8b 100644
--- a/sems-0008-Enable-sst_b2b-building-with-sems.patch
+++ b/sems-0008-Enable-sst_b2b-building-with-sems.patch
@@ -1,7 +1,7 @@
 From cd759bad822ee3d3680875714a118883bd033364 Mon Sep 17 00:00:00 2001
 From: Peter Lemenkov <lemenkov at gmail.com>
 Date: Mon, 27 Sep 2010 16:41:59 +0400
-Subject: [PATCH 8/8] Enable sst_b2b building with sems
+Subject: [PATCH 8/9] Enable sst_b2b building with sems
 
 Signed-off-by: Peter Lemenkov <lemenkov at gmail.com>
 ---
diff --git a/sems-0009-Fix-for-architectures-w-o-atomic-built-in-functions.patch b/sems-0009-Fix-for-architectures-w-o-atomic-built-in-functions.patch
new file mode 100644
index 0000000..14620bc
--- /dev/null
+++ b/sems-0009-Fix-for-architectures-w-o-atomic-built-in-functions.patch
@@ -0,0 +1,179 @@
+From bbc545dc10a89bf828fe3a18d786261785c47c46 Mon Sep 17 00:00:00 2001
+From: Peter Lemenkov <lemenkov at gmail.com>
+Date: Wed, 29 Sep 2010 11:42:29 +0400
+Subject: [PATCH 9/9] Fix for architectures w/o atomic built-in functions
+
+---
+ core/atomic_types.h |  113 ++++++++++++++++++++++++++++++++++++++++++++------
+ 1 files changed, 99 insertions(+), 14 deletions(-)
+
+diff --git a/core/atomic_types.h b/core/atomic_types.h
+index 4075eb4..474f169 100644
+--- a/core/atomic_types.h
++++ b/core/atomic_types.h
+@@ -1,31 +1,49 @@
+ #ifndef _atomic_types_h_
+ #define _atomic_types_h_
+ 
+-#if defined(__GNUC__)
+-# if defined(__GNUC_PATCHLEVEL__)
+-#  define __GNUC_VERSION__ (__GNUC__ * 10000 \
+-                            + __GNUC_MINOR__ * 100 \
+-                            + __GNUC_PATCHLEVEL__)
+-# else
+-#  define __GNUC_VERSION__ (__GNUC__ * 10000 \
+-                            + __GNUC_MINOR__ * 100)
+-# endif
++#if	(__GNUC__ > 4) || \
++	(__GNUC__ == 4 && __GNUC_MINOR__ >= 1) && \
++		( \
++		  (defined(__APPLE__) && \
++		    ( \
++		      defined(__ppc__) || \
++		      defined(__i386__) || \
++		      defined(__x86_64__) \
++		    ) \
++		  ) || \
++		  (defined(__linux__) && \
++		    ( \
++		      (defined(__i386__) && (defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4) && defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8))) || \
++		      defined(__ia64__) || \
++		      defined(__x86_64__) || \
++		      (defined(__powerpc__) && !defined(__powerpc64__)) || \
++		      defined(__alpha) \
++		     ) \
++		  ) \
++		  )
++#define HAVE_ATOMIC_CAS 1
+ #else
+-#error Unsupported compiler
+-#endif
+-
+-#if __GNUC_VERSION__ < 40101
+-#error GCC version >= 4.1.1 is required for proper atomic operations
++#warning Compare and Swap is not supported on this architecture
++#define HAVE_ATOMIC_CAS 0
+ #endif
+ 
+ #include <assert.h>
+ #include "log.h"
+ 
++#if !HAVE_ATOMIC_CAS
++#include "AmThread.h"
++#endif
++
++
+ // 32 bit unsigned integer
+ class atomic_int
++#if !HAVE_ATOMIC_CAS
++  : protected AmMutex
++#endif
+ {
+   volatile unsigned int i;
+ 
++
+ public:
+   atomic_int() : i(0) {}
+ 
+@@ -37,6 +55,7 @@ public:
+     return i;
+   }
+ 
++#if HAVE_ATOMIC_CAS
+   // ++i;
+   unsigned int inc() {
+     return __sync_add_and_fetch(&i,1);
+@@ -46,6 +65,25 @@ public:
+   unsigned int dec() {
+     return __sync_sub_and_fetch(&i,1);
+   }
++#else // if HAVE_ATOMIC_CAS
++  // ++i;
++  unsigned int inc() {
++    unsigned int res;
++    lock();
++    res = ++i;
++    unlock();
++    return res;
++  }
++
++  // --i;
++  unsigned int dec() {
++    unsigned int res;
++    lock();
++    res = --i;
++    unlock();
++    return res;
++  }
++#endif
+ 
+   // return --ll != 0;
+   bool dec_and_test() {
+@@ -55,10 +93,14 @@ public:
+ 
+ // 64 bit unsigned integer
+ class atomic_int64
++#if !HAVE_ATOMIC_CAS
++  : protected AmMutex
++#endif
+ {
+   volatile unsigned long long ll;
+   
+ public:
++#if HAVE_ATOMIC_CAS
+   void set(unsigned long long val) {
+ #if !defined(__LP64__) || !__LP64__
+     unsigned long long tmp_ll;
+@@ -95,6 +137,49 @@ public:
+     return __sync_sub_and_fetch(&ll,1);
+   }
+ 
++#else // if HAVE_ATOMIC_CAS
++
++  void set(unsigned long long val) {
++#if !defined(__LP64__) || !__LP64__
++    this->lock();
++    ll = val;
++    unlock();
++#else
++    ll = val;
++#endif
++  }
++  
++  unsigned long long get() {
++#if !defined(__LP64__) || !__LP64__
++    unsigned long long tmp_ll;
++    lock();
++    tmp_ll = ll;
++    unlock();
++    return tmp_ll;
++#else
++    return ll;
++#endif
++  }
++
++  // returns ++ll;
++  unsigned long long inc() {
++    unsigned long long res;
++    lock();
++    res = ++ll;
++    unlock();
++    return res;
++  }
++
++  // returns --ll;
++  unsigned long long dec() {
++    unsigned long long res;
++    lock();
++    res = --ll;
++    unlock();
++    return res;
++  }
++#endif
++
+   // return --ll == 0;
+   bool dec_and_test() {
+     return dec() == 0;
+-- 
+1.7.2.3
+
diff --git a/sems.spec b/sems.spec
index 1421981..2a9b48e 100644
--- a/sems.spec
+++ b/sems.spec
@@ -1,7 +1,7 @@
 Summary:	SIP Express Media Server, an extensible SIP media server
 Name:		sems
 Version:	1.3.0
-Release:	1%{?dist}
+Release:	2%{?dist}
 URL:		http://www.iptel.org/sems
 ## wget http://ftp.iptel.org/pub/sems/sems-1.3.0.tar.gz
 ## tar zx --exclude iLBC_rfc3951 -f sems-1.3.0..tar.gz
@@ -26,6 +26,8 @@ Patch6:		sems-0006-More-cmake-templates.patch
 Patch7:		sems-0007-Enable-py_sems-building-with-CMake.patch
 # Will be proposed for inclusion in upstream
 Patch8:		sems-0008-Enable-sst_b2b-building-with-sems.patch
+# Will be proposed for inclusion into upstream
+Patch9:		sems-0009-Fix-for-architectures-w-o-atomic-built-in-functions.patch
 
 BuildRoot:	%{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
 BuildRequires:	python >= 2.3
@@ -199,6 +201,9 @@ rm -rf core/plug-in/gsm/gsm-1.0-pl10/
 %patch6 -p1 -b .more_cmake
 %patch7 -p1 -b .enable_py_sems
 %patch8 -p1 -b .enable_sst_b2b
+%if 0%{?el5}
+%patch9 -p1 -b .no_atomic
+%endif
 
 
 iconv -f iso8859-1 -t UTF-8 doc/Readme.diameter_client.txt > doc/Readme.diameter_client.utf8 && mv doc/Readme.diameter_client.{utf8,txt}
@@ -601,6 +606,9 @@ fi
 %{_libdir}/%{name}/plug-in/xmlrpc2di.so
 
 %changelog
+* Wed Sep 29 2010 Peter Lemenkov <lemenkov at gmail.com> 1.3.0-2
+- Workaround for missing atomic built-ins in EPEL5 old gcc
+
 * Mon Sep 27 2010 Peter Lemenkov <lemenkov at gmail.com> 1.3.0-1
 - Ver. 1.3.0
 - Dropped half of all patches


More information about the scm-commits mailing list