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;                                                            \
 })
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to