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
#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
* SOFTWARE.
*/
+#if HAVE_CONFIG_H
+# include <config.h>
+#endif /* HAVE_CONFIG_H */
+
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
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);
}
lock_init(&client[i].lock);
client[i].index = i;
client[i].sock = INVALID_SOCKET;
+ atomic_init(&client[i].refcnt);
}
}
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);
* SOFTWARE.
*/
+#if HAVE_CONFIG_H
+# include <config.h>
+#endif /* HAVE_CONFIG_H */
+
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
* SOFTWARE.
*/
+#if HAVE_CONFIG_H
+# include <config.h>
+#endif /* HAVE_CONFIG_H */
+
#include <osd.h>
#include "libacm.h"
#include <infiniband/acm.h>
#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