qb  2.0.0.0
C++17 Actor Framework
qb Issue Watch Star Fork Follow @isndev
Loading...
Searching...
No Matches
prefix.h
Go to the documentation of this file.
1
31
32#ifndef QB_UTILS_PREFIX_H
33#define QB_UTILS_PREFIX_H
34
35/* this file defines the following macros:
36 QB_LOCKFREE_CACHELINE_BYTES: size of a cache line
37 QB_LOCKFREE_EVENT_BUCKET_BYTES: size of a event partition
38 QB_LOCKFREE_PTR_COMPRESSION: use tag/pointer compression to utilize parts
39 of the virtual address space as tag (at least 16bit)
40 QB_LOCKFREE_DCAS_ALIGNMENT: symbol used for aligning structs at cache line
41 boundaries
42*/
43
52constexpr std::size_t
54#ifdef KNOWN_L1_CACHE_LINE_SIZE
55 return KNOWN_L1_CACHE_LINE_SIZE;
56#elif defined(__cpp_lib_hardware_interference_size)
57 return std::hardware_destructive_interference_size;
58#else
59 return 64;
60#endif
61}
62
63#define QB_LOCKFREE_CACHELINE_BYTES cache_line_size()
64#define QB_LOCKFREE_EVENT_BUCKET_BYTES cache_line_size()
65
66#ifdef _MSC_VER
67
68#define QB_LOCKFREE_CACHELINE_ALIGNMENT __declspec(align(QB_LOCKFREE_CACHELINE_BYTES))
69#define QB_LOCKFREE_EVENT_BUCKET_ALIGNMENT \
70 __declspec(align(QB_LOCKFREE_EVENT_BUCKET_BYTES))
71
72#if defined(_M_IX86)
73#define QB_LOCKFREE_DCAS_ALIGNMENT
74#elif defined(_M_X64) || defined(_M_IA64)
75#define QB_LOCKFREE_PTR_COMPRESSION 1
76#define QB_LOCKFREE_DCAS_ALIGNMENT __declspec(align(16))
77#endif
78
79#endif /* _MSC_VER */
80
81#ifdef __GNUC__
82
83#define QB_LOCKFREE_CACHELINE_ALIGNMENT alignas(QB_LOCKFREE_CACHELINE_BYTES)
84#define QB_LOCKFREE_EVENT_BUCKET_ALIGNMENT alignas(QB_LOCKFREE_EVENT_BUCKET_BYTES)
85
86#if defined(__i386__) || defined(__ppc__)
87#define QB_LOCKFREE_DCAS_ALIGNMENT
88#elif defined(__x86_64__)
89#define QB_LOCKFREE_PTR_COMPRESSION 1
90#define QB_LOCKFREE_DCAS_ALIGNMENT __attribute__((aligned(16)))
91#elif defined(__alpha__)
92#define QB_LOCKFREE_PTR_COMPRESSION 1
93#define QB_LOCKFREE_DCAS_ALIGNMENT
94#endif
95#endif /* __GNUC__ */
96
108struct QB_LOCKFREE_CACHELINE_ALIGNMENT CacheLine {
109 uint32_t __raw__[QB_LOCKFREE_CACHELINE_BYTES / sizeof(uint32_t)];
110};
111
123struct QB_LOCKFREE_EVENT_BUCKET_ALIGNMENT EventBucket {
124 uint32_t __raw__[QB_LOCKFREE_EVENT_BUCKET_BYTES / sizeof(uint32_t)];
125};
126
127#endif /* QB_UTILS_PREFIX_H */
constexpr std::size_t cache_line_size()
Determines the optimal cache line size for the current platform at compile time.
Definition prefix.h:53
A structure automatically aligned to cache line boundaries.
Definition prefix.h:108
A structure aligned to event bucket boundaries, typically matching cache line size.
Definition prefix.h:123