Changeset: b1e75f220361 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b1e75f220361
Modified Files:
gdk/gdk_atomic.h
Branch: default
Log Message:
Reintroduce __sync_* calls for atomic operations for Intel compiler on Linux.
Also removed some (near) duplicate code.
diffs (214 lines):
diff --git a/gdk/gdk_atomic.h b/gdk/gdk_atomic.h
--- a/gdk/gdk_atomic.h
+++ b/gdk/gdk_atomic.h
@@ -121,9 +121,14 @@
#elif (defined(__GNUC__) || defined(__INTEL_COMPILER)) && !(defined(__sun__)
&& SIZEOF_SIZE_T == SIZEOF_LNG) && !defined(_MSC_VER)
#if SIZEOF_SSIZE_T == SIZEOF_LNG
+#define ATOMIC_TYPE lng
+#else
+#define ATOMIC_TYPE int
+#endif
-#define ATOMIC_TYPE lng
+#ifdef __ATOMIC_SEQ_CST
+/* the new way of doing this according to GCC */
#define ATOMIC_GET(var, lck, fcn) __atomic_load_n(&var, __ATOMIC_SEQ_CST)
#define ATOMIC_SET(var, val, lck, fcn) __atomic_store_n(&var, (val),
__ATOMIC_SEQ_CST)
#define ATOMIC_ADD(var, val, lck, fcn) __atomic_fetch_add(&var, (val),
__ATOMIC_SEQ_CST)
@@ -133,14 +138,13 @@
#else
-#define ATOMIC_TYPE int
-
-#define ATOMIC_GET(var, lck, fcn) __atomic_load_n(&var, __ATOMIC_SEQ_CST)
-#define ATOMIC_SET(var, val, lck, fcn) __atomic_store_n(&var, (val),
__ATOMIC_SEQ_CST)
-#define ATOMIC_ADD(var, val, lck, fcn) __atomic_fetch_add(&var, (val),
__ATOMIC_SEQ_CST)
-#define ATOMIC_SUB(var, val, lck, fcn) __atomic_fetch_sub(&var, (val),
__ATOMIC_SEQ_CST)
-#define ATOMIC_INC(var, lck, fcn) __atomic_add_fetch(&var, 1,
__ATOMIC_SEQ_CST)
-#define ATOMIC_DEC(var, lck, fcn) __atomic_sub_fetch(&var, 1,
__ATOMIC_SEQ_CST)
+/* the old way of doing this, (still?) needed for Intel compiler on Linux */
+#define ATOMIC_GET(var, lck, fcn) var
+#define ATOMIC_SET(var, val, lck, fcn) (var = (val))
+#define ATOMIC_ADD(var, val, lck, fcn) __sync_fetch_and_add(&var, (val))
+#define ATOMIC_SUB(var, val, lck, fcn) __sync_fetch_and_sub(&var, (val))
+#define ATOMIC_INC(var, lck, fcn) __sync_add_and_fetch(&var, 1)
+#define ATOMIC_DEC(var, lck, fcn) __sync_sub_and_fetch(&var, 1)
#endif
@@ -154,13 +158,15 @@
#else
#if SIZEOF_SSIZE_T == SIZEOF_LNG
+#define ATOMIC_TYPE lng
+#else
+#define ATOMIC_TYPE int
+#endif
-#define ATOMIC_TYPE lng
-
-static inline lng
-__ATOMIC_GET(volatile lng *var, pthread_mutex_t *lck)
+static inline ATOMIC_TYPE
+__ATOMIC_GET(volatile ATOMIC_TYPE *var, pthread_mutex_t *lck)
{
- lng old;
+ ATOMIC_TYPE old;
pthread_mutex_lock(lck);
old = *var;
pthread_mutex_unlock(lck);
@@ -168,10 +174,10 @@ static inline lng
}
#define ATOMIC_GET(var, lck, fcn) __ATOMIC_GET(&var, &(lck))
-static inline lng
-__ATOMIC_SET(volatile lng *var, lng val, pthread_mutex_t *lck)
+static inline ATOMIC_TYPE
+__ATOMIC_SET(volatile ATOMIC_TYPE *var, ATOMIC_TYPE val, pthread_mutex_t *lck)
{
- lng new;
+ ATOMIC_TYPE new;
pthread_mutex_lock(lck);
*var = val;
new = *var;
@@ -180,10 +186,10 @@ static inline lng
}
#define ATOMIC_SET(var, val, lck, fcn) __ATOMIC_SET(&var, (val), &(lck))
-static inline lng
-__ATOMIC_ADD(volatile lng *var, lng val, pthread_mutex_t *lck)
+static inline ATOMIC_TYPE
+__ATOMIC_ADD(volatile ATOMIC_TYPE *var, ATOMIC_TYPE val, pthread_mutex_t *lck)
{
- lng old;
+ ATOMIC_TYPE old;
pthread_mutex_lock(lck);
old = *var;
*var += val;
@@ -192,10 +198,10 @@ static inline lng
}
#define ATOMIC_ADD(var, val, lck, fcn) __ATOMIC_ADD(&var, (val), &(lck))
-static inline lng
-__ATOMIC_SUB(volatile lng *var, lng val, pthread_mutex_t *lck)
+static inline ATOMIC_TYPE
+__ATOMIC_SUB(volatile ATOMIC_TYPE *var, ATOMIC_TYPE val, pthread_mutex_t *lck)
{
- lng old;
+ ATOMIC_TYPE old;
pthread_mutex_lock(lck);
old = *var;
*var -= val;
@@ -204,10 +210,10 @@ static inline lng
}
#define ATOMIC_SUB(var, val, lck, fcn) __ATOMIC_SUB(&var, (val), &(lck))
-static inline lng
-__ATOMIC_INC(volatile lng *var, pthread_mutex_t *lck)
+static inline ATOMIC_TYPE
+__ATOMIC_INC(volatile ATOMIC_TYPE *var, pthread_mutex_t *lck)
{
- lng new;
+ ATOMIC_TYPE new;
pthread_mutex_lock(lck);
new = ++*var;
pthread_mutex_unlock(lck);
@@ -215,10 +221,10 @@ static inline lng
}
#define ATOMIC_INC(var, lck, fcn) __ATOMIC_INC(&var, &(lck))
-static inline lng
-__ATOMIC_DEC(volatile lng *var, pthread_mutex_t *lck)
+static inline ATOMIC_TYPE
+__ATOMIC_DEC(volatile ATOMIC_TYPE *var, pthread_mutex_t *lck)
{
- lng new;
+ ATOMIC_TYPE new;
pthread_mutex_lock(lck);
new = --*var;
pthread_mutex_unlock(lck);
@@ -226,81 +232,6 @@ static inline lng
}
#define ATOMIC_DEC(var, lck, fcn) __ATOMIC_DEC(&var, &(lck))
-#else
-
-#define ATOMIC_TYPE int
-
-static inline int
-__ATOMIC_GET(volatile int *var, pthread_mutex_t *lck)
-{
- int old;
- pthread_mutex_lock(lck);
- old = *var;
- pthread_mutex_unlock(lck);
- return old;
-}
-#define ATOMIC_GET(var, lck, fcn) __ATOMIC_GET(&var, &(lck))
-
-static inline int
-__ATOMIC_SET(volatile int *var, int val, pthread_mutex_t *lck)
-{
- int new;
- pthread_mutex_lock(lck);
- *var = val;
- new = *var;
- pthread_mutex_unlock(lck);
- return new;
-}
-#define ATOMIC_SET(var, val, lck, fcn) __ATOMIC_SET(&var, (val), &(lck))
-
-static inline int
-__ATOMIC_ADD(volatile int *var, int val, pthread_mutex_t *lck)
-{
- int old;
- pthread_mutex_lock(lck);
- old = *var;
- *var += val;
- pthread_mutex_unlock(lck);
- return old;
-}
-#define ATOMIC_ADD(var, val, lck, fcn) __ATOMIC_ADD(&var, (val), &(lck))
-
-static inline int
-__ATOMIC_SUB(volatile int *var, int val, pthread_mutex_t *lck)
-{
- int old;
- pthread_mutex_lock(lck);
- old = *var;
- *var -= val;
- pthread_mutex_unlock(lck);
- return old;
-}
-#define ATOMIC_SUB(var, val, lck, fcn) __ATOMIC_SUB(&var, (val), &(lck))
-
-static inline int
-__ATOMIC_INC(volatile int *var, pthread_mutex_t *lck)
-{
- int new;
- pthread_mutex_lock(lck);
- new = ++*var;
- pthread_mutex_unlock(lck);
- return new;
-}
-#define ATOMIC_INC(var, lck, fcn) __ATOMIC_INC(&var, &(lck))
-
-static inline int
-__ATOMIC_DEC(volatile int *var, pthread_mutex_t *lck)
-{
- int new;
- pthread_mutex_lock(lck);
- new = --*var;
- pthread_mutex_unlock(lck);
- return new;
-}
-#define ATOMIC_DEC(var, lck, fcn) __ATOMIC_DEC(&var, &(lck))
-
-#endif
-
#define ATOMIC_LOCK /* must use locks */
#define ATOMIC_INIT(lck, fcn) MT_lock_init(&(lck), fcn)
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list