From owner-svn-src-all@FreeBSD.ORG Fri Dec 30 01:37:26 2011 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 0F2961065670; Fri, 30 Dec 2011 01:37:26 +0000 (UTC) (envelope-from ed@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id E6CAE8FC0A; Fri, 30 Dec 2011 01:37:25 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id pBU1bPHu089211; Fri, 30 Dec 2011 01:37:25 GMT (envelope-from ed@svn.freebsd.org) Received: (from ed@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id pBU1bPda089209; Fri, 30 Dec 2011 01:37:25 GMT (envelope-from ed@svn.freebsd.org) Message-Id: <201112300137.pBU1bPda089209@svn.freebsd.org> From: Ed Schouten Date: Fri, 30 Dec 2011 01:37:25 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r228977 - head/include X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 30 Dec 2011 01:37:26 -0000 Author: ed Date: Fri Dec 30 01:37:25 2011 New Revision: 228977 URL: http://svn.freebsd.org/changeset/base/228977 Log: Extend to support GCC 4.7's __atomic. The development version of GCC also supports an atomics interface similar to Clang's. Change the header file to work as follows: - __CLANG_ATOMICS: Use Clang's new atomics interface, - __GNUC_ATOMICS: Use GCC's new atomics interface, - else: fall back to GCC's __sync interface. Modified: head/include/stdatomic.h Modified: head/include/stdatomic.h ============================================================================== --- head/include/stdatomic.h Fri Dec 30 00:59:08 2011 (r228976) +++ head/include/stdatomic.h Fri Dec 30 01:37:25 2011 (r228977) @@ -35,13 +35,13 @@ #if __has_feature(cxx_atomic) #define __CLANG_ATOMICS -#elif defined(__GNUC__) +#elif __GNUC_PREREQ__(4, 7) #define __GNUC_ATOMICS -#else +#elif !defined(__GNUC__) #error "stdatomic.h does not support your compiler" #endif -#ifdef __GNUC_ATOMICS +#if !defined(__CLANG_ATOMICS) #define _Atomic(T) struct { volatile T __val; } #endif @@ -52,7 +52,7 @@ #if defined(__CLANG_ATOMICS) #define ATOMIC_VAR_INIT(value) (value) #define atomic_init(obj, value) __atomic_init(obj, value) -#elif defined(__GNUC_ATOMICS) +#else #define ATOMIC_VAR_INIT(value) { .__val = (value) } #define atomic_init(obj, value) do { \ (obj)->__val = (value); \ @@ -106,19 +106,28 @@ enum memory_order { #if defined(__CLANG_ATOMICS) #define atomic_thread_fence(order) __atomic_thread_fence(order) +#define atomic_signal_fence(order) __asm volatile ("" : : : "memory"); #elif defined(__GNUC_ATOMICS) +#define atomic_thread_fence(order) __atomic_thread_fence(order) +#define atomic_signal_fence(order) __atomic_signal_fence(order) +#else #define atomic_thread_fence(order) __sync_synchronize() -#endif #define atomic_signal_fence(order) __asm volatile ("" : : : "memory"); +#endif /* * 7.17.5 Lock-free property. */ #if defined(__CLANG_ATOMICS) -#define atomic_is_lock_free(obj) __atomic_is_lock_free(obj) +#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) \ + __atomic_is_lock_free(sizeof((obj)->__val)) +#else +#define atomic_is_lock_free(obj) \ + (sizeof((obj)->__val) <= sizeof(void *)) #endif /* @@ -200,6 +209,31 @@ typedef _Atomic(__uintmax_t) atomic_uin __atomic_store(object, desired, order) #elif defined(__GNUC_ATOMICS) #define atomic_compare_exchange_strong_explicit(object, expected, \ + desired, success, failure) \ + __atomic_compare_exchange_n(&(object)->__val, expected, \ + desired, 0, success, failure) +#define atomic_compare_exchange_weak_explicit(object, expected, \ + desired, success, failure) \ + __atomic_compare_exchange_n(&(object)->__val, expected, \ + desired, 1, success, failure) +#define atomic_exchange_explicit(object, desired, order) \ + __atomic_exchange_n(&(object)->__val, desired, order) +#define atomic_fetch_add_explicit(object, operand, order) \ + __atomic_fetch_add(&(object)->__val, operand, order) +#define atomic_fetch_and_explicit(object, operand, order) \ + __atomic_fetch_and(&(object)->__val, operand, order) +#define atomic_fetch_or_explicit(object, operand, order) \ + __atomic_fetch_or(&(object)->__val, operand, order) +#define atomic_fetch_sub_explicit(object, operand, order) \ + __atomic_fetch_sub(&(object)->__val, operand, order) +#define atomic_fetch_xor_explicit(object, operand, order) \ + __atomic_fetch_xor(&(object)->__val, operand, order) +#define atomic_load_explicit(object, order) \ + __atomic_load_n(&(object)->__val, order) +#define atomic_store_explicit(object, desired, order) \ + __atomic_store_n(&(object)->__val, desired, order) +#else +#define atomic_compare_exchange_strong_explicit(object, expected, \ desired, success, failure) ({ \ __typeof__((object)->__val) __v; \ _Bool __r; \