Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 26 Dec 2011 23:33:41 +0000 (UTC)
From:      Ed Schouten <ed@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r228906 - head/include
Message-ID:  <201112262333.pBQNXflx026719@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ed
Date: Mon Dec 26 23:33:41 2011
New Revision: 228906
URL: http://svn.freebsd.org/changeset/base/228906

Log:
  Fix some bugs in <stdatomic.h>.
  
  - Make atomic_init() work for GCC, as assigning to structs doesn't work.
  - Fix misplaced parenthesis in atomic_is_lock_free() for GCC.
  - Make atomic_compare_exchange_strong() for GCC return the proper
    boolean value, whether object == expected.
  - Fix argument passing in atomic_exchange_explicit() for GCC.

Modified:
  head/include/stdatomic.h

Modified: head/include/stdatomic.h
==============================================================================
--- head/include/stdatomic.h	Mon Dec 26 22:25:58 2011	(r228905)
+++ head/include/stdatomic.h	Mon Dec 26 23:33:41 2011	(r228906)
@@ -54,7 +54,9 @@
 #define	atomic_init(obj, value)		__atomic_init(obj, value)
 #elif defined(__GNUC_ATOMICS)
 #define	ATOMIC_VAR_INIT(value)		{ .__val = (value) }
-#define	atomic_init(obj, value)		(obj = ATOMIC_VAR_INIT(value))
+#define	atomic_init(obj, value) do {					\
+	(obj)->__val = (value);						\
+} while (0)
 #endif
 
 /*
@@ -116,7 +118,7 @@ enum memory_order {
 #if defined(__CLANG_ATOMICS)
 #define	atomic_is_lock_free(obj)	__atomic_is_lock_free(obj)
 #elif defined(__GNUC_ATOMICS)
-#define	atomic_is_lock_free(obj)	(sizeof((obj->__val)) <= sizeof(void *))
+#define	atomic_is_lock_free(obj)	(sizeof((obj)->__val) <= sizeof(void *))
 #endif
 
 /*
@@ -200,12 +202,13 @@ typedef _Atomic(__uintmax_t)		atomic_uin
 #define	atomic_compare_exchange_strong_explicit(object, expected,	\
     desired, success, failure) ({					\
 	__typeof__((object)->__val) __v;				\
-	__v =								\
-	__sync_val_compare_and_swap((__typeof(&((object)->__val)))object,\
-		*expected, desired);					\
-	*expected = __v;						\
-	(*expected == __v);						\
-	})
+	_Bool __r;							\
+	__v = __sync_val_compare_and_swap(&(object)->__val,		\
+	    *(expected), desired);					\
+	__r = *(expected) == __v;					\
+	*(expected) = __v;						\
+	__r;								\
+})
 
 #define	atomic_compare_exchange_weak_explicit(object, expected,		\
     desired, success, failure)						\
@@ -223,7 +226,7 @@ typedef _Atomic(__uintmax_t)		atomic_uin
  */
 #define	atomic_exchange_explicit(object, desired, order) ({		\
 	__typeof__((object)->__val) __v;				\
-	__v = __sync_lock_test_and_set(object, desired);		\
+	__v = __sync_lock_test_and_set(&(object)->__val, desired);	\
 	__sync_synchronize();						\
 	__v;								\
 })



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201112262333.pBQNXflx026719>