]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Use isc/stdatomic.h to switch to __atomic builtins when compiling in C++ mode
authorOndřej Surý <ondrej@sury.org>
Fri, 24 Aug 2018 12:17:52 +0000 (14:17 +0200)
committerOndřej Surý <ondrej@sury.org>
Fri, 7 Sep 2018 14:55:22 +0000 (16:55 +0200)
lib/dns/acache.c
lib/isc/include/isc/refcount.h
lib/isc/include/isc/rwlock.h
lib/isc/include/isc/stdatomic.h [new file with mode: 0644]
lib/isc/stats.c
util/copyrights

index 60a466155caae5294f7324e4d836bc7e217b49cc..4e5fd405c874a7efe48e2405cf4ed7bfe0e2db25 100644 (file)
 #include <dns/zone.h>
 
 #if defined(ISC_PLATFORM_HAVESTDATOMIC)
+#if defined(__cplusplus)
+#include <isc/stdatomic.h>
+#else
 #include <stdatomic.h>
 #endif
+#endif
 
 #define ACACHE_MAGIC                   ISC_MAGIC('A', 'C', 'H', 'E')
 #define DNS_ACACHE_VALID(acache)       ISC_MAGIC_VALID(acache, ACACHE_MAGIC)
index 689429127603d7f6bb19c605f5fa809c70f20fa2..c911e5bf3eeb72350470d82108685eea4f13e641 100644 (file)
 #include <isc/types.h>
 
 #if defined(ISC_PLATFORM_HAVESTDATOMIC)
+#if defined (__cplusplus)
+#include <isc/stdatomic.h>
+#else
 #include <stdatomic.h>
 #endif
+#endif
 
 /*! \file isc/refcount.h
  * \brief Implements a locked reference counter.
index fcd72cab2f7208717fd6e5f23dfe4eee2071018f..b9575090f7f35d381a7a6f05b068250c635ee1c5 100644 (file)
 #include <isc/types.h>
 
 #if defined(ISC_PLATFORM_HAVESTDATOMIC)
+#if defined(__cplusplus)
+#include <isc/stdatomic.h>
+#else
 #include <stdatomic.h>
 #endif
+#endif
 
 ISC_LANG_BEGINDECLS
 
diff --git a/lib/isc/include/isc/stdatomic.h b/lib/isc/include/isc/stdatomic.h
new file mode 100644 (file)
index 0000000..723ed1e
--- /dev/null
@@ -0,0 +1,146 @@
+/*
+ * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * See the COPYRIGHT file distributed with this work for additional
+ * information regarding copyright ownership.
+ */
+
+#pragma once
+
+#if !defined(__has_feature)
+#define __has_feature(x) 0
+#endif
+
+#if !defined(__has_extension)
+#define __has_extension(x) __has_feature(x)
+#endif
+
+#if !defined(__GNUC_PREREQ__)
+#if defined(__GNUC__) && defined(__GNUC_MINOR__)
+#define __GNUC_PREREQ__(maj, min)                    \
+       ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
+#else
+#define __GNUC_PREREQ__(maj, min) 0
+#endif
+#endif
+
+#if !defined(__CLANG_ATOMICS) && !defined(__GNUC_ATOMICS)
+#if __has_extension(c_atomic) || __has_extension(cxx_atomic)
+#define __CLANG_ATOMICS
+#elif __GNUC_PREREQ__(4, 7)
+#define __GNUC_ATOMICS
+#elif !defined(__GNUC__)
+#error "isc/stdatomic.h does not support your compiler"
+#endif
+#endif
+
+#ifndef __ATOMIC_RELAXED
+#define __ATOMIC_RELAXED        0
+#endif
+#ifndef __ATOMIC_CONSUME
+#define __ATOMIC_CONSUME        1
+#endif
+#ifndef __ATOMIC_ACQUIRE
+#define __ATOMIC_ACQUIRE        2
+#endif
+#ifndef __ATOMIC_RELEASE
+#define __ATOMIC_RELEASE        3
+#endif
+#ifndef __ATOMIC_ACQ_REL
+#define __ATOMIC_ACQ_REL        4
+#endif
+#ifndef __ATOMIC_SEQ_CST
+#define __ATOMIC_SEQ_CST        5
+#endif
+
+
+enum memory_order {
+       memory_order_relaxed = __ATOMIC_RELAXED,
+       memory_order_consume = __ATOMIC_CONSUME,
+       memory_order_acquire = __ATOMIC_ACQUIRE,
+       memory_order_release = __ATOMIC_RELEASE,
+       memory_order_acq_rel = __ATOMIC_ACQ_REL,
+       memory_order_seq_cst = __ATOMIC_SEQ_CST
+};
+
+typedef enum memory_order memory_order;
+
+typedef int_fast32_t   atomic_int_fast32_t;
+typedef uint_fast32_t  atomic_uint_fast32_t;
+typedef int_fast64_t   atomic_int_fast64_t;
+typedef uint_fast64_t  atomic_uint_fast64_t;
+
+#if defined(__CLANG_ATOMICS) /* __c11_atomic builtins */
+#define atomic_init(obj, desired)              \
+       __c11_atomic_init(obj, desired)
+#define atomic_load_explicit(obj, order)       \
+       __c11_atomic_load(obj, order)
+#define atomic_store_explicit(obj, desired, order)     \
+       __c11_atomic_store(obj, desired, order)
+#define atomic_fetch_add_explicit(obj, arg, order)     \
+       __c11_atomic_fetch_add(obj, arg, order)
+#define atomic_fetch_sub_explicit(obj, arg, order)     \
+       __c11_atomic_fetch_sub(obj, arg, order)
+#define atomic_compare_exchange_strong_explicit(obj, expected, desired, succ, fail)    \
+       __c11_atomic_compare_exchange_strong_explicit(obj, expected, desired, succ, fail)
+#define atomic_compare_exchange_weak_explicit(obj, expected, desired, succ, fail)      \
+       __c11_atomic_compare_exchange_weak_explicit(obj, expected, desired, succ, fail)
+#elif defined(__GNUC_ATOMICS) /* __atomic builtins */
+#define atomic_init(obj, desired)                      \
+       (*obj = desired)
+#define atomic_load_explicit(obj, order)               \
+       __atomic_load_n(obj, order)
+#define atomic_store_explicit(obj, desired, order)     \
+       __atomic_store_n(obj, desired, order)
+#define atomic_fetch_add_explicit(obj, arg, order)     \
+       __atomic_fetch_add(obj, arg, order)
+#define atomic_fetch_sub_explicit(obj, arg, order)     \
+       __atomic_fetch_sub(obj, arg, order)
+#define atomic_compare_exchange_strong_explicit(obj, expected, desired, succ, fail)    \
+       __atomic_compare_exchange_n(obj, expected, desired, 0, succ, fail)
+#define atomic_compare_exchange_weak_explicit(obj, expected, desired, succ, fail)      \
+       __atomic_compare_exchange_n(obj, expected, desired, 1, succ, fail)
+#else /* __sync builtins */
+#define atomic_init(obj, desired)                      \
+       (*obj = desired)
+#define atomic_load_explicit(obj, order)               \
+       __sync_fetch_and_add(obj, 0)
+#define atomic_store_explicit(obj, desired, order)     \
+       do {                                            \
+               __sync_synchronize();                   \
+               *obj = desired;                         \
+               __sync_synchronize();                   \
+       } while (0);
+#define atomic_fetch_add_explicit(obj, arg, order) \
+       __sync_fetch_and_add(obj, arg)
+#define atomic_fetch_sub_explicit(obj, arg, order) \
+       __sync_fetch_and_sub(obj, arg, order)
+#define atomic_compare_exchange_strong_explicit(obj, expected, desired, succ, fail)    \
+       ({                                                                      \
+               __typeof__(obj) __v;                                            \
+               _Bool __r;                                                      \
+               __v = __sync_val_compare_and_swap(obj, *(expected), desired);   \
+               __r = *(expected) == __v;                                       \
+               *(expected) = __v;                                              \
+               __r;                                                            \
+       })
+#define atomic_compare_exchange_weak_explicit(obj, expected, desired, succ, fail)      \
+       atomic_compare_exchange_strong_explicit(obj, expected, desired, succ, fail)
+#endif
+
+#define atomic_load(obj) \
+       atomic_load_explicit(obj, memory_order_seq_cst)
+#define atomic_store(obj) \
+       atomic_store_explicit(obj, memory_order_seq_cst)
+#define atomic_fetch_add(obj) \
+       atomic_fetch_add_explicit(obj, arg, memory_order_seq_cst)
+#define atomic_fetch_sub(obj) \
+       atomic_fetch_sub_explicit(obj, arg, memory_order_seq_cst)
+#define atomic_compare_exchange_strong(obj, expected, desired) \
+       atomic_compare_exchange_strong_explicit(obj, expected, desired, memory_order_seq_cst, memory_order_seq_cst)
+#define atomic_compare_exchange_weak(obj, expected, desired)   \
+       atomic_compare_exchange_weak_explicit(obj, expected, desired, memory_order_seq_cst, memory_order_seq_cst)
index 0ecf2048de5596dd64f9dbbdd1fc57ff6578bec9..196099ee7279334501ee827918bc9dc663cacb4e 100644 (file)
 #include <isc/util.h>
 
 #if defined(ISC_PLATFORM_HAVESTDATOMIC)
+#if defined(__cplusplus)
+#include <isc/stdatomic.h>
+#else
 #include <stdatomic.h>
 #endif
+#endif
 
 #define ISC_STATS_MAGIC                        ISC_MAGIC('S', 't', 'a', 't')
 #define ISC_STATS_VALID(x)             ISC_MAGIC_VALID(x, ISC_STATS_MAGIC)
index b9672a5dfaaeb5618207d8704f4a32cff549a29f..b3de62394ea91bd6c3bdf05709841f0e98409b71 100644 (file)
 ./lib/isc/include/isc/sockaddr.h               C       1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2009,2012,2015,2016,2018
 ./lib/isc/include/isc/socket.h                 C       1998,1999,2000,2001,2002,2004,2005,2006,2007,2008,2009,2011,2012,2013,2014,2016,2018
 ./lib/isc/include/isc/stats.h                  C       2009,2012,2016,2018
+./lib/isc/include/isc/stdatomic.h              C       2018
 ./lib/isc/include/isc/stdio.h                  C       2000,2001,2004,2005,2006,2007,2013,2016,2018
 ./lib/isc/include/isc/stdlib.h                 C       2003,2004,2005,2006,2007,2016,2018
 ./lib/isc/include/isc/string.h                 C       2000,2001,2003,2004,2005,2006,2007,2014,2016,2018