summaryrefslogtreecommitdiffstats
path: root/src/3rdparty/forkfd/forkfd_gcc.h
blob: e5cbbe60e0b20c0624539dc8a4f7f02f02c7ca10 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
/****************************************************************************
**
** Copyright (C) 2013 Intel Corporation
**
** $QT_BEGIN_LICENSE:BSD$
** You may use this file under the terms of the BSD license as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
**   * Redistributions of source code must retain the above copyright
**     notice, this list of conditions and the following disclaimer.
**   * Redistributions in binary form must reproduce the above copyright
**     notice, this list of conditions and the following disclaimer in
**     the documentation and/or other materials provided with the
**     distribution.
**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
**     the names of its contributors may be used to endorse or promote
**     products derived from this software without specific prior written
**     permission.
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
****************************************************************************/

#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