]> git.openfabrics.org - ~shefty/ibacm.git/commitdiff
ibacm: support distros with older versions of gcc
authorSean Hefty <sean.hefty@intel.com>
Wed, 25 Aug 2010 17:26:22 +0000 (10:26 -0700)
committerSean Hefty <sean.hefty@intel.com>
Wed, 25 Aug 2010 17:26:22 +0000 (10:26 -0700)
ibacm implements atomics using gcc intrinsics that were introduced
in gcc 4.1.2.  If an older version of gcc is used to compile the
code, an error results.  Check that the required atomic calls are
supported, and if not, provide our own implementation.

This fixes a build issue on RH 5.x.

Signed-off-by: Sean Hefty <sean.hefty@intel.com>
configure.in
linux/osd.h
src/acm.c
src/acme.c
src/libacm.c
windows/osd.h

index 997c77592cf80ac6cde4f5c537bf04946aaa473a..dfddeacfbf53016c9cfaf53a02287643fc47cc8c 100644 (file)
@@ -39,6 +39,16 @@ AC_CHECK_HEADER(infiniband/umad.h, [],
     AC_MSG_ERROR([<infiniband/umad.h> not found.  Is libibumad installed?]))\r
 fi\r
 \r
+dnl Check for gcc atomic intrinsics\r
+AC_MSG_CHECKING(compiler support for atomics)\r
+AC_TRY_LINK([int i = 0;],\r
+    [ return __sync_add_and_fetch(&i, 1) != __sync_sub_and_fetch(&i, 1); ],\r
+    [ AC_MSG_RESULT(yes) ],\r
+    [\r
+        AC_MSG_RESULT(no)\r
+        AC_DEFINE(DEFINE_ATOMICS, 1, [Set to 1 to implement atomics])\r
+    ])\r
+\r
 AC_CACHE_CHECK(whether ld accepts --version-script, ac_cv_version_script,\r
     if test -n "`$LD --help < /dev/null 2>/dev/null | grep version-script`"; then\r
         ac_cv_version_script=yes\r
index 722e1b13342cac5741736cc3dfb65d52fe18ec86..28c3647bae18a2d4ab23f69192a5a29bafb94cde 100644 (file)
 #endif\r
 #define ntohll(x) htonll(x)\r
 \r
+#if DEFINE_ATOMICS\r
+typedef struct { pthread_mutex_t mut; int val; } atomic_t;\r
+static inline int atomic_inc(atomic_t *atomic)\r
+{\r
+       int v;\r
+\r
+       pthread_mutex_lock(&atomic->mut);\r
+       v = ++(atomic->val);\r
+       pthread_mutex_unlock(&atomic->mut);\r
+       return v;\r
+}\r
+static inline int atomic_dec(atomic_t *atomic)\r
+{\r
+       int v;\r
+\r
+       pthread_mutex_lock(&atomic->mut);\r
+       v = --(atomic->val);\r
+       pthread_mutex_unlock(&atomic->mut);\r
+       return v;\r
+}\r
+static inline void atomic_init(atomic_t *atomic)\r
+{\r
+       pthread_mutex_init(&atomic->mut, NULL);\r
+       atomic->val = 0;\r
+}\r
+#else\r
 typedef struct { volatile int val; } atomic_t;\r
-#define atomic_inc(v) (__sync_fetch_and_add(&(v)->val, 1) + 1)\r
-#define atomic_dec(v) (__sync_fetch_and_sub(&(v)->val, 1) - 1)\r
+#define atomic_inc(v) (__sync_add_and_fetch(&(v)->val, 1))\r
+#define atomic_dec(v) (__sync_sub_and_fetch(&(v)->val, 1))\r
+#define atomic_init(v) ((v)->val = 0)\r
+#endif\r
 #define atomic_get(v) ((v)->val)\r
 #define atomic_set(v, s) ((v)->val = s)\r
 \r
index 7c8b84bc20cc48fc9244eade0d93b1ce1d4ccaee..820365cfc5d91901304c5e620e112a25eeb8b211 100644 (file)
--- a/src/acm.c
+++ b/src/acm.c
  * SOFTWARE.
  */
 
+#if HAVE_CONFIG_H
+#  include <config.h>
+#endif /* HAVE_CONFIG_H */
+
 #include <stdio.h>
 #include <stdarg.h>
 #include <string.h>
@@ -268,6 +272,7 @@ acm_init_dest(struct acm_dest *dest, uint8_t addr_type, uint8_t *addr, size_t si
        memcpy(dest->address, addr, size);
        dest->addr_type = addr_type;
        DListInit(&dest->req_queue);
+       atomic_init(&dest->refcnt);
        atomic_set(&dest->refcnt, 1);
        lock_init(&dest->lock);
 }
@@ -1560,6 +1565,7 @@ static void acm_init_server(void)
                lock_init(&client[i].lock);
                client[i].index = i;
                client[i].sock = INVALID_SOCKET;
+               atomic_init(&client[i].refcnt);
        }
 }
 
@@ -2680,6 +2686,8 @@ int CDECL_FUNC main(int argc, char **argv)
        acm_log(0, "Assistant to the InfiniBand Communication Manager\n");
        acm_log_options();
 
+       atomic_init(&tid);
+       atomic_init(&wait_cnt);
        DListInit(&dev_list);
        DListInit(&timeout_list);
        event_init(&timeout_event);
index 7428a57a83255ce138b3d44ac04823ffd6949330..e03679fd9bed4282bd0ed8a0a0d0a4fd7aa8b5a5 100644 (file)
  * SOFTWARE.
  */
 
+#if HAVE_CONFIG_H
+#  include <config.h>
+#endif /* HAVE_CONFIG_H */
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
index 32fd7e22b5433d9379688eb2656e1585c52e5c15..9d56cd29ba10ab0ac51ab1ca0bb617582a1d7259 100644 (file)
  * SOFTWARE.
  */
 
+#if HAVE_CONFIG_H
+#  include <config.h>
+#endif /* HAVE_CONFIG_H */
+
 #include <osd.h>
 #include "libacm.h"
 #include <infiniband/acm.h>
index 10e5e18a89f0cf30f39219944f2d903d6e9ea305..9587c51858cbeff019785fc1a7bc9d69eab3ceb4 100644 (file)
@@ -44,6 +44,7 @@ typedef struct { volatile LONG val; } atomic_t;
 #define atomic_dec(v) InterlockedDecrement(&(v)->val)\r
 #define atomic_get(v) ((v)->val)\r
 #define atomic_set(v, s) ((v)->val = s)\r
+#define atomic_init(v) ((v)->val = 0)\r
 \r
 #define event_t          HANDLE\r
 #define event_init(e)    *(e) = CreateEvent(NULL, FALSE, FALSE, NULL)\r