summaryrefslogtreecommitdiffstats
path: root/src/3rdparty/forkfd/forkfd_gcc.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/3rdparty/forkfd/forkfd_gcc.h')
-rw-r--r--src/3rdparty/forkfd/forkfd_gcc.h63
1 files changed, 63 insertions, 0 deletions
diff --git a/src/3rdparty/forkfd/forkfd_gcc.h b/src/3rdparty/forkfd/forkfd_gcc.h
new file mode 100644
index 0000000000..b495944595
--- /dev/null
+++ b/src/3rdparty/forkfd/forkfd_gcc.h
@@ -0,0 +1,63 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 Intel Corporation
+**
+** Permission is hereby granted, free of charge, to any person obtaining a copy
+** of this software and associated documentation files (the "Software"), to deal
+** in the Software without restriction, including without limitation the rights
+** to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+** copies of the Software, and to permit persons to whom the Software is
+** furnished to do so, subject to the following conditions:
+**
+** The above copyright notice and this permission notice shall be included in
+** all copies or substantial portions of the Software.
+**
+** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+** AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+** OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+** THE SOFTWARE.
+**
+****************************************************************************/
+
+#ifndef FFD_ATOMIC_GCC_H
+#define FFD_ATOMIC_GCC_H
+
+/* atomics */
+/* we'll use the GCC 4.7 atomic builtins
+ * See http://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html#_005f_005fatomic-Builtins
+ * Or in texinfo: C Extensions > __atomic Builtins
+ */
+typedef int ffd_atomic_int;
+#define ffd_atomic_pointer(type) type*
+
+#define FFD_ATOMIC_INIT(val) (val)
+
+#define FFD_ATOMIC_RELAXED __ATOMIC_RELAXED
+#define FFD_ATOMIC_ACQUIRE __ATOMIC_ACQUIRE
+#define FFD_ATOMIC_RELEASE __ATOMIC_RELEASE
+// acq_rel & cst not necessary
+
+#if !defined(__GNUC__) || \
+ ((__GNUC__ - 0) * 100 + (__GNUC_MINOR__ - 0)) < 407 || \
+ (defined(__INTEL_COMPILER) && __INTEL_COMPILER-0 < 1310) || \
+ (defined(__clang__) && ((__clang_major__-0) * 100 + (__clang_minor-0)) < 303)
+#define ffd_atomic_load_n(ptr,order) *(ptr)
+#define ffd_atomic_store_n(ptr,val,order) (*(ptr) = (val), (void)0)
+#define ffd_atomic_exchange_n(ptr,val,order) __sync_lock_test_and_set(ptr, val)
+#define ffd_atomic_compare_exchange_n(ptr,expected,desired,weak,order1,order2) \
+ __sync_bool_compare_and_swap(ptr, *(expected), desired) ? 1 : \
+ (*(expected) = *(ptr), 0)
+#define ffd_atomic_add_fetch(ptr,val,order) __sync_add_and_fetch(ptr, val)
+#else
+#define ffd_atomic_load(ptr,order) __atomic_load_n(ptr, order)
+#define ffd_atomic_store(ptr,val,order) __atomic_store_n(ptr, val, order)
+#define ffd_atomic_exchange(ptr,val,order) __atomic_exchange_n(ptr, val, order)
+#define ffd_atomic_compare_exchange(ptr,expected,desired,order1,order2) \
+ __atomic_compare_exchange_n(ptr, expected, desired, 1, order1, order2)
+#define ffd_atomic_add_fetch(ptr,val,order) __atomic_add_fetch(ptr, val, order)
+#endif
+
+#endif