summaryrefslogtreecommitdiff
path: root/src/third_party/wiredtiger/src/include/hardware.h
blob: a93f1e41fbc501fc3fde676c795ccbfb1e9b347c (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
77
78
79
80
81
82
83
84
85
86
87
88
/*-
 * Copyright (c) 2014-2019 MongoDB, Inc.
 * Copyright (c) 2008-2014 WiredTiger, Inc.
 *	All rights reserved.
 *
 * See the file LICENSE for redistribution information.
 */

/*
 * Publish a value to a shared location. All previous stores must complete before the value is made
 * public.
 */
#define WT_PUBLISH(v, val)  \
    do {                    \
        WT_WRITE_BARRIER(); \
        (v) = (val);        \
    } while (0)

/* Write after all previous stores are completed. */
#define WT_ORDERED_WRITE(v, val) \
    do {                         \
        WT_WRITE_BARRIER();      \
        (v) = (val);             \
    } while (0)

/*
 * Read a shared location and guarantee that subsequent reads do not see any earlier state.
 */
#define WT_ORDERED_READ(v, val) \
    do {                        \
        (v) = (val);            \
        WT_READ_BARRIER();      \
    } while (0)

/*
 * Atomic versions of the flag set/clear macros.
 */
#define F_ISSET_ATOMIC(p, mask) ((p)->flags_atomic & (uint8_t)(mask))

#define F_SET_ATOMIC(p, mask)                                                              \
    do {                                                                                   \
        uint8_t __orig;                                                                    \
        do {                                                                               \
            __orig = (p)->flags_atomic;                                                    \
        } while (!__wt_atomic_cas8(&(p)->flags_atomic, __orig, __orig | (uint8_t)(mask))); \
    } while (0)

#define F_CLR_ATOMIC(p, mask)                                                               \
    do {                                                                                    \
        uint8_t __orig;                                                                     \
        do {                                                                                \
            __orig = (p)->flags_atomic;                                                     \
        } while (!__wt_atomic_cas8(&(p)->flags_atomic, __orig, __orig & ~(uint8_t)(mask))); \
    } while (0)

/*
 * Cache line alignment.
 */
#if defined(__PPC64__) || defined(PPC64)
#define WT_CACHE_LINE_ALIGNMENT 128
#elif defined(__s390x__)
#define WT_CACHE_LINE_ALIGNMENT 256
#else
#define WT_CACHE_LINE_ALIGNMENT 64
#endif

/*
 * Pad a structure so an array of structures get separate cache lines.
 *
 * Note that we avoid compiler structure alignment because that requires
 * allocating aligned blocks of memory, and alignment pollutes any other type
 * that contains an aligned field.  It is possible that a hot field positioned
 * before this one will be on the same cache line, but not if it is also
 * padded.
 *
 * This alignment has a small impact on portability as well, as we are using an
 * anonymous union here which is supported under C11, earlier versions of
 * the GNU standard, and MSVC versions as early as 2003.
 */
#define WT_CACHE_LINE_PAD_BEGIN \
    union {                     \
        struct {
#define WT_CACHE_LINE_PAD_END                \
    }                                        \
    ;                                        \
    char __padding[WT_CACHE_LINE_ALIGNMENT]; \
    }                                        \
    ;